在深入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 -hUSAGE: iosnoop [-hQst] [-d device] [-i iotype] [-p PID] [-n name][]-d device-i iotype-n name-p PID-Q-s-t-hdurationeg,iosnoopiosnoop 1iosnoop -Qiosnoop -tsiosnoop -i '*R*'iosnoop -p 91iosnoop -Qp 91
案例
./iosnoop -tsTracing block I/O. Ctrl-C to end.STARTs ENDs COMM PID TYPE DEV BLOCK BYTES LATms26269565.311980 26269565.312218 kworker/0:1H 90 WM 8,0 4722696 20480 0.2426269565.312027 26269565.312242 kworker/0:1H 90 WM 8,0 4730760 4096 0.2226269565.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延迟,可以使用以下命令:
./biolatencyTracing block device I/O... Hit Ctrl-C to end.^Cusecs : count distribution0 -> 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 githubcd FlameGraphperf record -F 99 -a -g -- sleep 60perf script | ./stackcollapse-perf.pl > out.perf-foldedout.perf-folded > perf.svg
使用chrome 打开

这里,-F 999设置了非常高的采样频率,-a表示对整个系统进行采样,./a.out是要分析的程序。perf script将采样数据转换为文本格式,然后使用flamegraph.pl脚本生成火焰图flamegraph.svg,可视化地显示应用程序中的CPU使用情况,快速定位热点函数。
Linux Observability Tools:展示了Linux可观测性工具的地图,这些工具用于监控和理解系统的行为和性能。

Linux Static Performance Analysis Tools:提供了用于静态性能分析的工具地图,这些工具帮助分析代码和系统配置。

Linux Benchmarking Tools:介绍了用于基准测试的工具地图,用于评估系统在特定负载下的性能。

Linux Tuning Tools:展示了用于系统性能调优的工具地图,包括各种参数调整和优化技术。

Linux sar:提供了系统活动记录(sar)工具的地图,这是一个用于收集系统活动数据的工具。

Hi-res diagram combining observability, static performance tuning, and perf-tools/bcc:这是一张高分辨率图,结合了可观测性、静态性能调优和perf-tools/bcc工具的信息。

Linux eBPF:介绍了Linux eBPF技术及其应用。

bcc: Taming Linux 4.3+ Tracing Superpowers:展示了bcc工具如何帮助管理和利用Linux 4.3及以上版本的追踪功能。

Linux eBPF Off-CPU Flame Graph:提供了使用bcc工具生成的Linux eBPF离CPU火焰图,帮助分析系统在非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
原文作者:五分钟学SRE;如有侵权,请联系管理员删除。