当前位置: 首页 > news >正文

OceanBase 4.x改装:另一种全链路追踪的尝试

本文作者:夏克

OceanBase 社区文档贡献者,曾多次参与 OceanBase 技术征文比赛,获得优秀名次。从事金融行业核心系统设计开发工作多年,服务于某交易所子公司,现阶段负责国产数据库调研。

本文为 OceanBase 第七期技术征文活动「小鱼快跑|OceanBase 4.1 上手体验」的优秀投稿文章之一,分享给大家,欢迎大家评论区一起交流。

前些天看了一篇《OceanBase 4.0 解读:全链路追踪要解决什么问题?从一条慢SQL说起》的文章,不得不说这是目前为止 OceanBase 4.x 最吸引我的功能。在分布式数据库系统中,由于系统规模变大、组件数量增多、系统拓扑结构变得更加复杂,因此对系统进行监测和调试变得更加困难。可观测/追踪技术在这种情况下具有重要的作用,它可以帮助我们监测和调试系统,快速发现问题并解决它们。可以说全链路追踪技术对运维体验来说是质的改进。

恰巧我最近也在研究可观测技术,与 OpenTracing 模型不同,本文将使用一种灵活而强大的 linux 内核技术——eBPF,来实现对 OceanBase 追踪与观测的尝试。

图片

大部分的 DBA 可能没有使用过 eBPF 技术,说起来算是一个比较小众的技术领域,一些 Linux 内核研发人员可能比较熟悉。在一些开源数据库中,如 MySQL、PostgreSQL 中已经使用了相关技术。eBPF 出现的早期主要是用于网络抓包和网络包的过滤,类似 tcpdump、wireshark 之类的抓包工具,后来用来替代内核模块的部分功能,以非侵入式的方式拓展内核模块的功能(主要是监控、过滤、负载均衡等)。eBPF 技术还是比较复杂的,因此很难用较短的篇幅将它讲透彻。

本文主要是抛砖引玉,通过一个例子介绍如何使用 eBPF 对 OceanBase 进行观测。例程中会修改 OceanBase 源码,目的是埋入一些探针,通过 eBPF 内核程序采集应用数据,并提供给 eBPF 用户程序进行展示。

图片

一、什么是 eBPF?

eBPF(extended Berkeley Packet Filter)是一种在 Linux 内核中运行的虚拟机,可以动态地编写并注入内核级别的代码,用于网络、安全、性能等方面的监测和调试。

eBPF 最初是为网络分析设计的,但现在已被广泛应用于系统性能分析、安全审计和容器监控等领域。它通过在内核中运行用户代码来收集和分析数据,而不需要修改内核或加载内核模块,因此具有高度灵活性和可移植性。

eBPF 程序可以在内核态和用户态之间进行交互,从而允许用户从内核中获得关于系统和应用程序的详细信息。这些信息可以用于调试、优化和监控系统性能、网络流量、安全审计等方面。

eBPF 已经成为 Linux 生态系统中不可或缺的一部分,被广泛应用于云原生、容器化、网络监控等场景中,成为了开发人员和运维人员的得力工具之一。

二、eBPF 的跟踪方式

eBPF 有几种常用的追踪方式,包括:

  • Kprobe:Kprobe 是一种内核级别追踪方式,可以在内核函数入口或出口处插入跟踪点,从而收集内核函数的参数和返回值等信息。Kprobe 可以用于跟踪内核函数的性能和行为,帮助进行系统性能分析和故障排除。

  • Uprobe:Uprobe是一种用户空间追踪方式,可以在用户空间程序的函数入口或出口处插入跟踪点,从而收集用户空间程序的性能数据和其他有用信息。与 Kprobe 类似,Uprobe 也可以用于跟踪用户空间程序的性能和行为,帮助进行系统性能分析和故障排除。

  • Tracepoint:Tracepoint 是一种内核级别追踪方式,它会在内核代码中预定义的位置插入跟踪点,从而收集内核函数的性能数据和其他有用信息。Tracepoint 的优势在于它可以在不修改内核源代码的情况下进行跟踪。

  • Perf:Perf 是一种内核级别追踪工具,可以用于在内核中插入跟踪点,从而收集性能数据和其他有用信息。Perf 可以用于跟踪 CPU 事件、内存事件、磁盘 I/O 事件等。

  • USDT(User-Level Statically Defined Tracing):USDT 是一种用户空间追踪方式,可以通过在应用程序中插入特殊的跟踪点,从而在运行时收集应用程序的性能数据和其他有用信息。USDT 使用静态定义的方式在应用程序中插入跟踪点,从而可以在应用程序不需要重新编译的情况下进行追踪。

理论上 eBPF 可以通过多种手段对基础设施,操作系统和应用进行全方位的非侵入式观测。后面的例程将使用 USDT 对 OceanBase 实现追踪与观测(USDT 只是 eBPF 技术的很小一部分功能)。

三、USDT

USDT(User Statically Defined Tracepoints)是 eBPF 的一种特性,可以让用户在应用程序中定义自己的跟踪点,从而实现更精细的性能分析和调试。使用  eBPF USDT,需要分为以下几个步骤:

  • 在应用程序中添加 USDT 跟踪点:在应用程序中,通过添加类似于以下代码的宏定义,在代码中定义自己的跟踪点;

#include <sys/sdt.h>int main() {DTRACE_PROBE(MyProvider, myprobe);    return 0;}

  • 编写 eBPF 程序:编写一个 eBPF 程序,用于捕获和处理 USDT 跟踪点生成的事件。可以使用 libbpf 等工具来简化 eBPF 程序的编写和管理;

  • 加载 eBPF 程序:通过 BPF_MAP_TYPE_PERF_EVENT_ARRAY 类型的 BPF map,将 eBPF 程序与 USDT 跟踪点关联起来,从而在跟踪点生成事件时,将事件发送到 eBPF 程序中处理。可以使用 BCC 等工具来简化 eBPF 程序的加载和管理。

  • 分析数据:在 eBPF 程序中,可以使用 BPF_PERF_OUTPUT 类型的 BPF map,将处理后的事件发送到用户空间,并使用 BCC 等工具进行数据分析和可视化。

总之,eBPF 的 USDT 可以让用户在应用程序中定义自己的跟踪点,从而实现更精细的性能分析和调试。使用 USDT 包括:添加跟踪点、编写 eBPF 程序、加载 eBPF 程序和分析数据四个步骤。

图片

由于篇幅原因这部分尽量省去比较繁琐的环境搭建步骤。感兴趣的同学可以自行官网查阅。

一、OceanBase 环境搭建

我这里是手动编译,并使用命令行启动 observer,具体步骤省略。只记录一些必要的命令。

mkdir -p /home/frank/data/clogmkdir -p /home/frank/data/slog/servermkdir -p /home/frank/data/sstable
./observer -r 127.0.0.1:2882:2881 -p 2881 -P 2882 -z zone1 -n obcluster -c 1 -d /home/frank/data -i lo -l INFO -o ob_trx_idle_timeout=120,__min_full_resource_pool_memory=2147483648,enable_syslog_recycle=True,enable_syslog_wf=True,max_syslog_file_count=4,memory_limit=6G,datafile_size=20G,log_disk_size=24G,system_memory=1G,cpu_count=16 -l ERROR
obclient -h 127.0.0.1 -P 2881 -uroot

注意,值得一提的是我是用 WLS 的 ubuntu 22,编译时 pthread 库存在版本问题,解决方式如下:

  • 报错:ld.lld: error: undefined symbol: pthread_mutex_consistent_np

Consolidate compiler generated dependencies of target obcdc_staticConsolidate compiler generated dependencies of target obcdc[ 97%] Built target obcdc_static[ 97%] Linking CXX executable observer[ 97%] Linking CXX shared library libobcdc.sold.lld: error: undefined symbol: pthread_mutexattr_setrobust_np>>> referenced by proc_mutex.c>>>               proc_mutex.o:(proc_mutex_pthread_create) in archive ../../../deps/3rd/usr/local/oceanbase/deps/devel/lib/libapr-1.a>>> did you mean: pthread_mutexattr_setrobust_np@GLIBC_2.4>>> defined in: /lib/x86_64-linux-gnu/libc.so.6
ld.lld: error: undefined symbol: pthread_mutex_consistent_np>>> referenced by proc_mutex.c>>>               proc_mutex.o:(proc_mutex_pthread_acquire) in archive ../../../deps/3rd/usr/local/oceanbase/deps/devel/lib/libapr-1.a>>> referenced by proc_mutex.c>>>               proc_mutex.o:(proc_mutex_pthread_tryacquire) in archive ../../../deps/3rd/usr/local/oceanbase/deps/devel/lib/libapr-1.a>>> did you mean: pthread_mutex_consistent_np@GLIBC_2.4>>> defined in: /lib/x86_64-linux-gnu/libc.so.6
ld.lld: error: undefined symbol: sys_siglist>>> referenced by signals.c>>>               signals.o:(apr_signal_description_get) in archive ../../../deps/3rd/usr/local/oceanbase/deps/devel/lib/libapr-1.a
ld.lld: error: undefined symbol: pthread_yield>>> referenced by thread.c>>>               thread.o:(apr_thread_yield) in archive ../../../deps/3rd/usr/local/oceanbase/deps/devel/lib/libapr-1.aclang-11: error: linker command failed with exit code 1 (use -v to see invocation)make[2]: *** [src/observer/CMakeFiles/observer.dir/build.make:154: src/observer/observer] Error 1make[1]: *** [CMakeFiles/Makefile2:10163: src/observer/CMakeFiles/observer.dir/all] Error 2make[1]: *** Waiting for unfinished jobs....[ 97%] Built target obcdcmake: *** [Makefile:166: all] Error 2

  • 解决方法:用系统的 libapr 0.7.0 库替换依赖包中的 libapr 0.6.5 库。

图片

图片

二、BCC环境搭建

▋ 编译内核

# 编译内核apt-get install flex bison libssl-dev libelf-dev dwarvesgit clone https://github.com/microsoft/WSL2-Linux-Kernel.gitcd WSL2-Linux-KernelKERNEL_VERSION=$(uname -r | cut -d '-' -f 1)git checkout linux-msft-wsl-$KERNEL_VERSION
cp Microsoft/config-wsl .configmake oldconfig && make preparemake scriptsmake modulessudo make modules_install
sudo mv /lib/modules/$KERNEL_VERSION-microsoft-standard-WSL2+/ /lib/modules/$KERNEL_VERSION-microsoft-standard-WSL2

▋ 内核参数设置

CONFIG_BPF=yCONFIG_BPF_SYSCALL=y# [optional, for tc filters]CONFIG_NET_CLS_BPF=m# [optional, for tc actions]CONFIG_NET_ACT_BPF=mCONFIG_BPF_JIT=y# [for Linux kernel versions 4.1 through 4.6]CONFIG_HAVE_BPF_JIT=y# [for Linux kernel versions 4.7 and later]CONFIG_HAVE_EBPF_JIT=y# [optional, for kprobes]CONFIG_BPF_EVENTS=y# Need kernel headers through /sys/kernel/kheaders.tar.xzCONFIG_IKHEADERS=y

▋ 编译安装BCC

sudo apt install liblzma-devsudo apt install libclang-14-devgit clone https://github.com/iovisor/bcc.gitmkdir bcc/build; cd bcc/buildcmake ..makesudo make install
cmake -DPYTHON_CMD=python3 .. # build python3 bindingpushd src/python/makesudo make installpopd

图片

一、修改 OceanBase 源码

因为是例程,因此这部分只增加了一个探针,探针位置放在处理 SQL 的入口处 stmt_query。

文件路径 src/sql/ob_sql.cpp,共修改两行代码。

  • 增加头文件,包含必要的静态跟踪点;

  • 增加探针;

图片

  • 注意,目前 DTRACE_PROBE 函数最多支持 12 个参数。

图片

  • 重新编译 observer

二、查看探针

通过 tplist/tplist-bpfcc 和 readelf 两种方式可以看到对应的探针已经埋入,与代码对应 Provider 是 OceanBase,Name 是 stmt_query。

$ tplist-bpfcc -l /home/frank/github/oceanbase/build_debug/src/observer/observer# 注意:要使用绝对路径

图片

$ readelf -n observer

三、编写 eBPF 观测代码

这里使用 BCC 的 python 框架编写观测代码,当然,也可使用 C、Golang 编写。

#!/usr/bin/python
from __future__ import print_functionfrom bcc import BPF, USDTfrom bcc.utils import printbimport sys
if len(sys.argv) < 2:    print("USAGE: OceanBase_latency PID")    exit()pid = sys.argv[1]debug = 0
# load BPF programbpf_text = """#include <uapi/linux/ptrace.h>int do_trace(struct pt_regs *ctx) {    uint64_t addr;    char query[128];    bpf_usdt_readarg(1, ctx, &addr);    bpf_probe_read_user(&query, sizeof(query), (void *)addr);    bpf_trace_printk("%s\\n", query);    return 0;};"""
# enable USDT probe from given PIDu = USDT(pid=int(pid))u.enable_probe(probe="stmt_query", fn_name="do_trace")if debug:    print(u.get_text())    print(bpf_text)
# initialize BPFb = BPF(text=bpf_text, usdt_contexts=[u])
# headerprint("%-18s %-16s %-6s %-6s %s" % ("TIME(s)", "COMM", "PID", "CPU", "QUERY"))
# format outputwhile 1:    try:        (task, pid, cpu, flags, ts, msg) = b.trace_fields()    except ValueError:        print("value error")        continue    except KeyboardInterrupt:        exit()    printb(b"%-18.9f %-16s %-6d %-6d %s" % (ts, task, pid, cpu, msg))

*注解:

  • bpf_text :该变量保存的是在内核空间执行的C代码,主要功能是捕获并打印query信息。

  • u.enable_probe(probe="stmt_query", fn_name="do_trace"):stmt_query是OceanBase中我们埋下的probe观察点。do_trace是观察点出发时要执行的跟踪函数。

  • 上面代码的功能是,当OceanBase进程收到sql时触发观察点,并将获取的sql文本传递给观察者。

当然,理论上可以观测任意用户埋下的探针,这里只为说明技术应用场景,不以提供完整的观测系统为目的。

四、运行范例

Step1:启动 observer

Step2:启动观测例程:sudo python3 ob_query.py pidof observer

可以看到,probe 捕获了经过观测点的所有 SQL。

*注意:

  • 需要root权限执行,sudo。

  • 参数是observer的进程id,pidof observer

图片

作为改善 OceanBase 易用性的重要一环,未来的 4.x 将着力提升运维体验,新增包括 ASH(Active Session History)、Realtime SQL Plan Monitor、Logical Plan Manager 等在内的更多功能,希望本文能给 OceanBase的研发团队提供一些有价值的参考。

由于篇幅有限,本人水平有限,因此关于 eBPF 相关技术并没有深入介绍,USDT 只是 eBPF 的冰山一角,其强大的功能足以实现一套完整、复杂的分布式数据库可观测系统。另外,从观察机制上分析 eBPF 大部分的观测是非侵入式的,在内核空间实现的,从性能的消耗上看应该比 OpenTracing 更小。

相关文章:

OceanBase 4.x改装:另一种全链路追踪的尝试

本文作者&#xff1a;夏克 OceanBase 社区文档贡献者&#xff0c;曾多次参与 OceanBase 技术征文比赛&#xff0c;获得优秀名次。从事金融行业核心系统设计开发工作多年&#xff0c;服务于某交易所子公司&#xff0c;现阶段负责国产数据库调研。 本文为 OceanBase 第七期技术征…...

springCloudAlibaba详解

一、概述 1、简介 Spring Cloud Alibaba&#xff0c;它是由一些阿里巴巴的开源组件和云产品组成的。这个项目的目的是为了给Java开发者带来使用 Spring Boot 和 Spring Cloud 的更多便利。 Spring Cloud Alibaba 致力于 提供微服务开发的一站式解决方案。该项目包含开发分布…...

python通过docker打包执行

背景 正常情况下,python脚本执行需要安装有python环境,那python环境虽然也可以通过移植的方法来安装,那总归是比较麻烦的,下面通过docker打包的方式来执行python脚本 1、安装python镜像 准备两个文件即可,dockerfile、requirements.txt两个文件的内容分别如下 同目录下…...

实现公网远程访问:Windows本地快速搭建SFTP文件服务器并配置端口映射

文章目录 1. 搭建SFTP服务器1.1 下载 freesshd服务器软件1.3 启动SFTP服务1.4 添加用户1.5 保存所有配置 2 安装SFTP客户端FileZilla测试2.1 配置一个本地SFTP站点2.2 内网连接测试成功 3 使用cpolar内网穿透3.1 创建SFTP隧道3.2 查看在线隧道列表 4. 使用SFTP客户端&#xff0…...

获取文件路径

String fName " D:\\C#_Source\\test\\uploadFile\\test.xlsx";// 方法一&#xff1a; File tempFile new File( fName.trim());String fileName tempFile.getName();System.out.println("fileName " fileName);// 方法二&#xff1a; String fName …...

如何自己实现一个丝滑的流程图绘制工具(八) 创建节点的文本标签

背景 节点的文本标签不希望是通过节点编辑实现&#xff0c;而是拿到节点名字渲染上去&#xff0c;包括连接线 createLabel(element, name, parent) {const modeling this.bpmnModeler.get(modeling)let labelCenter {}// 连接线上的标签if (element.type bpmn:SequenceFlo…...

Spring Boot多数据源配置运行报错:No operations allowed after connection closed连接异常的解决

上一篇文章我们讲了如何配置多数据源&#xff0c;但是配置在使用一段时间之后&#xff0c;查询数据库会发生报错&#xff1a;No operations allowed after connection closed。 一、问题原因&#xff1a; 经过排查发现是因为MySQL5.0以后针对超长时间DB连接做了一个处理&#…...

3、QT 的基础控件的使用

一、qFileDialog 文件窗体 Header: #include <QFileDialog> qmake: QT widgets Inherits: QDialog静态函数接口&#xff1a; void Widget::on_pushButton_clicked() {//获取单个文件的路径名QString filename QFileDialog :: getOpenFileName(this, tr("Open Fi…...

爬虫逆向实战(二十六)--某某学堂登录

一、数据接口分析 主页地址&#xff1a;某某学堂 1、抓包 通过抓包可以发现数据接口是Account/LoginPost 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现pass是加密参数 请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 无co…...

leetcode分类刷题:哈希表(Hash Table)(四、前缀和 处理连续子数组)

1、leetcode题目里对于元素加和的考察可谓是屡见不鲜&#xff0c;包括 简单的限定一个有效答案的两个或多个元素求和leetcode分类刷题&#xff1a;哈希表&#xff08;Hash Table&#xff09;&#xff08;一、简单的两数之和&#xff09;、在有序数组内对加和等于target的三元组…...

如何处理生产环境中的数据倾斜问题?

分析&回答 1、flink数据倾斜的表现&#xff1a; 任务节点频繁出现反压&#xff0c;增加并行度也不能解决问题 部分节点出现OOM异常&#xff0c;是因为大量的数据集中在某个节点上&#xff0c;导致该节点内存被爆&#xff0c;任务失败重启 2、数据倾斜产生的原因&#x…...

【WSN无线传感器网络恶意节点】使用 MATLAB 进行无线传感器网络部署研究

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

C# 实现浏览器控件设置

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System...

1130 - Host ‘17216.18083‘ is not allowed to connect to this MySQL server

mysql5.7 设置root远程登录 1、登录数据库 mysql -u root -p 2、设置root 用户允许远程登录,"your password" 是自己设置的密码&#xff1b; GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY your password WITH GRANT OPTION; 3、刷新权限 FLUSH PRIVILEG…...

使用Spring的getBeansOfType实现接口多实现类的动态调用

使用Spring的getBeansOfType实现接口多实现类的动态调用 package com.xxl.job.admin.core.alarm;import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.admin.core.model.XxlJobLog; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sp…...

(笔记三)opencv图像基础操作

强调&#xff1a;本文只为学习记录做笔记 详细可参考opencv官网 &#xff1a;https://docs.opencv.org/4.1.1/d0/d86/tutorial_py_image_arithmetics.html &#xff08;1&#xff09;将cv2的BGR模式改为RGB模式 #!/usr/bin/env python # -*- coding:utf-8 -*- ""&q…...

PHP入门及环境搭建 - XAMPP

文章目录 PHP简介搭建PHP环境(XAMPP)下载XAMPP安装XAMPP第1步:双击setup_xampp.bat检测第2步:启动Apache和MySQL第3步:浏览器访问内置的启动页面readme文档 - 必读运行Hello World程序下载并安装Eclipse for PHP编写Hello World程序参考目标: 1、了解PHP语言 2、搭建PHP开…...

开学季ipad手写笔什么牌子好?第三方电容笔推荐

自从ipad之类的平板电脑上出现了电容笔&#xff0c;电容笔就成功的取代了我们的手指&#xff0c;大大加快了我们的写作速度。不过&#xff0c;由于苹果pencil自带的先进芯片&#xff0c;导致其售价一直很高&#xff0c;给很多人&#xff0c;特别是学生&#xff0c;造成了很大的…...

【力扣】62. 不同路径 <动态规划>

【力扣】62. 不同路径 一个机器人位于一个 m m m x n n n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。问总共有多少条…...

【Python小项目】Python的GUI库Tkinter实现随机点名工具或抽奖工具并封装成.exe可执行文件

文章目录 一、项目背景二、需求分析UI界面设计如下:具体需求如下:二、实现思路三、项目关键代码读取excel中的人员名单实现随机滚动抽取主函数中Tkinter的界面相关操作实现窗口相关背景图设置组件相关完整代码四、将程序封装成.exe可执行文件将代码转换成.py文件五、总结与拓…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...