性能调优
本文最后更新于:2024年9月25日 下午
性能调优
性能优化
ltrace
strace
ftrace
-
1
2
3trace-cmd list -f snd_usb_audio
trace-cmd record -p function_graph -g usb_audio_probe
trace-cmd report1
trace-cmd record -p function_graph -g vfs_statx ls /runtime-mnt/alluxio/default/hbase3/alluxio-13
trace-cmd record
:用于记录内核中的跟踪数据。-p function_graph
:使用function_graph
追踪器,记录函数的调用路径,显示每个函数的进入和退出时间,便于分析函数执行顺序和耗时。-g vfs_statx
:指定要跟踪的内核函数,这里是vfs_statx
,用于获取文件的元数据(类似于stat
系统调用)。ls /runtime-mnt/alluxio/default/hbase3/alluxio-13
:运行ls
命令,列出指定目录的内容,这会触发vfs_statx
函数。
ftrace hook
perf
-
1
2
3
4
5
6sudo apt install linux-perf
git clone https://github.com/brendangregg/FlameGraph.git
cd FlameGraph
sudo perf record -F 99 -p 512318 -g -- sleep 30
sudo perf report -i perf.data
sudo perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > WXWork.exe.svg
perf 基本使用
1 |
|
perf record
1 |
|
1 |
|
在 perf report
输出中,数据的各列信息如下:
- Overhead:表示每个函数在所有采样中占用的 CPU 时间百分比。
- Command:表示执行该函数的命令或进程名(例如
fstime
)。 - Shared Object:表示函数所在的共享库或二进制文件(例如
[kernel.kallsyms]
表示内核,libc.so.6
表示 C 标准库)。 - Symbol:表示函数的名称(例如
__arch_copy_to_user
、read
、write
)。
简单总结
__arch_copy_to_user
:占用 15.14% 的 CPU 时间。el0_svc_common
:占用 8.07% 的 CPU 时间。__arch_copy_from_user
:占用 7.72% 的 CPU 时间。read
:占用 7.13% 的 CPU 时间。write
:占用 6.77% 的 CPU 时间。
选择某一行深入分析
移动键盘上下键选择第一行__arch_copy_to_user
,然后按enter。
1 |
|
在 perf report
中,可以执行以下操作:
- Annotate
__arch_copy_to_user
:查看__arch_copy_to_user
函数的汇编代码级别性能注释。 - Zoom into
fstime
thread:查看fstime
线程的详细性能数据。 - Zoom into the Kernel DSO:查看内核共享对象的详细性能数据。
- Browse map details:查看地址映射的详细信息。
- Run scripts for samples of symbol [__arch_copy_to_user]:对
__arch_copy_to_user
符号的样本运行分析脚本。 - Run scripts for all samples:对所有样本运行分析脚本。
- Switch to another data file in PWD:切换到当前目录中的另一个数据文件。
Kernel DSO
在 perf report
中,Kernel DSO(Dynamic Shared Object)指的是内核的共享对象或模块,它是内核的运行时组件。具体来说:
Kernel DSO:在内核空间中,虽然内核本身不是一个传统意义上的共享库,但内核的功能和符号可以被视作类似于动态共享对象。在性能分析中,Kernel DSO 表示内核的各个部分(如模块、驱动程序等),这些部分在执行期间动态地被加载到内存中。
使用场景:在性能分析中,你可以查看 Kernel DSO 的详细数据,以了解内核模块或驱动程序的性能表现,找出性能瓶颈或潜在问题。
简单总结:
- Kernel DSO 是指在内核空间动态加载的共享对象或模块,用于分析内核部分的性能。
perf record -F 99 -g
1 |
|
-F 99
:设置采样频率为 99 Hz。-g
:捕获调用栈信息。
1 |
|
perf report
中各列的含义如下:
- Children:函数及其子函数的总 CPU 时间占比。
- Self:函数自身的 CPU 时间占比。
- Command:执行的命令或进程名。
- Shared Object:函数所在的库或二进制文件。
- Symbol:函数名称。
性能采集小工具
获取自制性能采集小工具:
1 |
|
重新加载systemd配置:
1 |
|
开机自动启动且立马启动性能采集服务:
1 |
|
查看性能采集服务状态:
1 |
|
查看性能采集服务日志:
1 |
|
关闭性能采集服务:
1 |
|
禁止性能采集服务开机自动启动:
1 |
|
收集日志:
/var/log:系统日志
/var/log/iostat:实时报告系统的磁盘 I/O 统计信息
/var/log/pidstat:找到 IO 占用高的进程
/var/log/top:实时报告系统的进程资源占用
/var/log/perf:实时报告系统的性能热点
perf实践
hcache
eBPF
bpftrace
1 |
|
您提供的命令是使用 bpftrace 工具来跟踪信号生成事件,并打印相关信息。让我解释一下这个命令的含义:
bpftrace:是一个强大的跟踪和探查工具,它使用BPF(Berkley Packet Filter)技术来提供对内核和用户空间的动态跟踪能力。
-e:这是 bpftrace 命令的选项,用于指定要执行的跟踪程序。
'tracepoint:signal:signal_generate { printf("Process %d %s send SIGNAL %d to process %d %s", pid, comm, args->sig, args->pid, args->comm); }':这是要执行的 bpftrace 跟踪程序。
跟踪程序的含义是:当信号生成事件(signal_generate)发生时,打印相关信息。具体来说,它打印了发送信号的进程的进程ID(pid)、进程名称(comm),以及接收信号的进程的进程ID(args->pid)和进程名称(args->comm)。
这个命令可以帮助您跟踪信号的生成情况,并提供有关发送和接收信号的进程信息。您可以根据需要修改打印的信息或添加其他的跟踪逻辑来满足您的需求。请注意,使用 bpftrace 跟踪程序需要在支持BPF的内核版本上运行,并具有足够的权限。
SIGTERM
专门追踪信号:SIGTERM (15):
1 |
|
专门追踪信号:SIGTERM (15)并输出到sigterm.log:
1 |
|
oom
追踪OOM Killer事件:
1 |
|
追踪kprobe:vhost_work_queue:
1 |
|
pstack
method tracing
Grafana
安装环境:
1 |
|
由于主机9090端口被占用,故通过systemd启动prometheus时需要更改一下端口为9999:
1 |
|
开启自启:
1 |
|
登录grafana:
1 |
|
Add your first data source:
选择Prometheus
Connection
Prometheus server URL *填入下方url:
1 |
|
跳到最下方点击Save & test即可。
Create your first dashboard:
Import dashboard填入下方链接(本机为deepin 20.9,不支持最新版本的Node Exporter Full,建议使用下方链接):
1 |
|
也可通过id导入,建议id:
1 |
|
prometheus-alertmanager暂未配置。
- Install Grafana on Debian or Ubuntu
- 分分钟搞定Grafana(图文详解)
- CentOS7搭建prometheus 监控Linux主机
- Node Exporter Full
unixbench
https://github.com/kdlucas/byte-unixbench/tree/master
1
git clone https://github.com/kdlucas/byte-unixbench.git
-
1
2
3cd ~/byte-unixbench-5.1.3/UnixBench
mount -o size=2G -t tmpfs none tmp