在深入Linux系统的复杂世界中,性能优化始终是SRE关注的热点。最近在拜读国际著名的 LINUX 性能专家 Brendan Gregg 的个人博客和技术书籍。他的工作不仅涵盖了系统性能的监控和分析,还深入探讨了性能问题的根源及其解决方案。通过他的个人博客和技术书籍,我们可以窥见Linux性能优化的精髓,学习到如何利用各种工具和方法来提升系统效率,确保应用的顺畅运行。将会结合 Brendan Gregg博文与个人理解 出一个拜读系列博文。
这期我们将介绍几个由Brendan Gregg开发或推广的性能分析工具,包括perf
、eBPF工具、perf-tools
、bcc
和bpftrace
,以及如何使用它们来提升系统性能。
perf
运用场景:性能调优、系统分析、代码优化等。
常见命令:
perf record
: 记录一段时间内发生的系统性能事件,如CPU周期、缓存命中/失效等。perf report
: 展示性能记录的结果,帮助分析程序的性能瓶颈。perf top
: 实时监控系统性能,动态显示最耗时的函数和指令。具体案例:在Linux系统中,可以使用perf record
命令对特定程序进行性能采样分析。例如,对于一个编译过的C++程序,可以使用以下命令进行采样:
perf record -F 99 -a -g -- sleep 10
这里,-F 99
设置了采样频率为99Hz,-a
表示对整个系统进行采样,-g
启用调用图形记录,--
后面跟随的是被采样的命令,这里是让系统休眠60秒。采样完成后,使用perf report
命令生成性能报告,分析程序的热点函数和性能瓶颈。
eBPF工具
运用场景:系统跟踪、网络分析、安全监控等。
常见命令:
bpftrace
: 使用BPF跟踪器执行跟踪脚本,如监控文件系统调用、网络包等。bpftool
: 是一个BPF程序和映射的管理工具,可以用来创建、查询和删除BPF程序。具体案例:可以使用bpftrace
脚本来跟踪所有的系统调用,并使用bpftool
将结果导出到一个跟踪文件中。例如,以下是一个简单的bpftrace
脚本,用于跟踪并打印所有的open
系统调用:
bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("open: %s\n", str(args->filename)); }'
运行此脚本将打印出每个open
调用尝试打开的文件名。通过分析这些数据,可以识别频繁发生的系统调用,进而优化系统性能。
perf-tools
工具安装
git clone --depth 1 https://github.com/brendangregg/perf-toolsOr use the raw links on github to download individual scripts. Eg:wget https://raw.githubusercontent.com/brendangregg/perf-tools/master/iosnoop
运用场景:系统性能分析、内核跟踪等。
常见命令:
iosnoop
: 跟踪并报告磁盘I/O活动,帮助识别I/O密集型进程。tcptracer
: 跟踪TCP连接的建立、传输和终止过程。具体案例:使用iosnoop
监控磁盘I/O操作,可以通过以下命令启动:
先从github 同步脚本
https://github.com/brendangregg/perf-tools/blob/master/iosnoop
参数查看
./iosnoop -h
USAGE: iosnoop [-hQst] [-d device] [-i iotype] [-p PID] [-n name]
[duration]
-d device # device string (eg, "202,1)
-i iotype # match type (eg, '*R*' for all reads)
-n name # process name to match on I/O issue
-p PID # PID to match on I/O issue
-Q # use queue insert as start time
-s # include start time of I/O (s)
-t # include completion time of I/O (s)
-h # this usage message
duration # duration seconds, and use buffers
eg,
iosnoop # watch block I/O live (unbuffered)
iosnoop 1 # trace 1 sec (buffered)
iosnoop -Q # include queueing time in LATms
iosnoop -ts # include start and end timestamps
iosnoop -i '*R*' # trace reads
iosnoop -p 91 # show I/O issued when PID 91 is on-CPU
iosnoop -Qp 91 # show I/O queued by PID 91, queue time
案例
./iosnoop -ts
Tracing block I/O. Ctrl-C to end.
STARTs ENDs COMM PID TYPE DEV BLOCK BYTES LATms
26269565.311980 26269565.312218 kworker/0:1H 90 WM 8,0 4722696 20480 0.24
26269565.312027 26269565.312242 kworker/0:1H 90 WM 8,0 4730760 4096 0.22
26269565.312031 26269565.312243 kworker/0:1H 90 WM 8,0 4730896 4096 0.21
bcc
工具仓库
https://github.com/iovisor/bcc#tools
在linux 系统的位置
cd /usr/share/bcc/tools
运用场景:内核跟踪、性能调优、网络分析等。
常见命令
biolatency
: 监控块设备的I/O延迟,分析延迟的来源。tcptop
: 实时显示TCP连接的状态,包括传输速率和重传信息。具体案例:通过biolatency
分析块设备的I/O延迟,可以使用以下命令:
./biolatency
Tracing block device I/O... Hit Ctrl-C to end.
^C
usecs : count distribution
0 -> 1 : 0 | |
2 -> 3 : 0 | |
4 -> 7 : 0 | |
8 -> 15 : 5 | |
16 -> 31 : 76 |***** |
32 -> 63 : 280 |******************** |
64 -> 127 : 538 |****************************************|
128 -> 255 : 204 |*************** |
256 -> 511 : 92 |****** |
512 -> 1023 : 63 |**** |
1024 -> 2047 : 22 |* |
2048 -> 4095 : 16 |* |
4096 -> 8191 : 98 |******* |
8192 -> 16383 : 200 |************** |
16384 -> 32767 : 103 |******* |
32768 -> 65535 : 11 | |
65536 -> 131071 : 1 | |
131072 -> 262143 : 1 | |
bpftrace
安装
https://github.com/bpftrace/bpftrace/blob/master/INSTALL.md
运用场景:内核跟踪、性能分析、安全监控等。
常见命令
trace
: 执行BPF跟踪脚本,如监控内核函数的执行。profile
: 执行BPF性能分析脚本,统计函数的执行频率和耗时。具体案例:编写一个bpftrace
脚本,跟踪系统调用的执行情况,并统计每个调用的执行次数和耗时。例如,以下脚本统计了read
和write
系统调用的发生次数:
bpftrace -e 'tracepoint:syscalls:sys_enter_read,sys_enter_write { @[comm] = count(); }'
通过profile
命令,可以生成一个性能报告,识别潜在的性能问题:
bpftrace -e 'profile:hz:99 { @[comm] = count(); }'
这将每99Hz采样一次,统计并输出每个进程的read
和write
调用次数。
火焰图(Flame Graphs)
文章链接
https://www.brendangregg.com/flamegraphs.html
运用场景:CPU分析、内存分析等。
常见命令:通过perf
和其他性能分析工具生成火焰图,如使用perf script
将perf record
的输出转换为火焰图。
具体案例:使用perf record
对程序进行采样,然后通过perf script
和flamegraph
工具生成CPU火焰图。例如,对一个C程序进行分析的命令如下:
git clone https://github.com/brendangregg/FlameGraph # or download it from github
cd FlameGraph
perf record -F 99 -a -g -- sleep 60
perf script | ./stackcollapse-perf.pl > out.perf-folded
./flamegraph.pl out.perf-folded > perf.svg
使用chrome 打开
这里,-F 999
设置了非常高的采样频率,-a
表示对整个系统进行采样,./a.out
是要分析的程序。perf script
将采样数据转换为文本格式,然后使用flamegraph.pl
脚本生成火焰图flamegraph.svg
,可视化地显示应用程序中的CPU使用情况,快速定位热点函数。
推荐博文:
https://www.brendangregg.com/blog/2016-01-20/ebpf-offcpu-flame-graph.html
https://github.com/brendangregg/FlameGraph
https://www.brendangregg.com/linuxperf.html