Linux性能工具概览:perf、strace、ltrace、gprof、Valgrind、FlameGraph简介
说实话,刚入行那会儿,我面对Linux性能问题也是一头雾水。系统变慢了,CPU飙高了,内存泄漏了——到底该用哪个工具?
后来我慢慢摸索出一套自己的打法。今天就把这些工具挨个儿给你捋一遍。它们就像工具箱里的不同扳手,各有各的用处。
工具全家福:一张图看懂
先给你看张我画的工具关系图。这样你心里就有谱了:
perf:CPU热点分析的瑞士军刀
perf 是我用得最多的工具,没有之一。它内置于Linux内核,不需要额外安装。说白了,它就是靠硬件性能计数器来采样CPU正在执行什么代码。
我记得有一次线上服务CPU飙到90%,我直接用 perf top 一看,好家伙,一个字符串处理函数占了60%的CPU。改了一行代码,CPU直接降到20%。
常用命令速查:
perf top- 实时查看CPU热点,类似top但更细粒度perf record ./myapp- 记录性能数据到perf.dataperf report- 分析perf.data,生成报告perf stat ./myapp- 统计程序运行时的硬件事件
# 实战:找出CPU最热的函数
perf record -F 99 -g ./myapp # 99Hz采样,记录调用栈
perf report -g graph # 以调用图方式展示
我的小技巧:采样频率设99Hz而不是100Hz,是为了避免与系统时钟同步产生偏差。这个坑我踩过。
strace 和 ltrace:追踪程序的每一次呼吸
strace 追踪系统调用,ltrace 追踪库函数调用。这两个工具就像给程序装了个窃听器,它干了什么你全知道。
为什么会用到它们?我举个例子。有次一个程序启动特别慢,用 strace 一看,发现它在反复读取一个不存在的配置文件,每次读取都要等超时。去掉这个文件读取,启动时间从30秒降到0.5秒。
# strace 实战
strace -c ./myapp # 统计系统调用次数和耗时
strace -e open,read ./myapp # 只追踪open和read调用
strace -p 1234 # 附加到正在运行的进程
# ltrace 实战
ltrace -c ./myapp # 统计库函数调用
ltrace -e malloc ./myapp # 只看malloc调用
注意:strace 会大幅降低程序运行速度(可能慢10-100倍)。生产环境慎用!我曾经在线上 strace 了一个高并发服务,结果服务直接超时了...
gprof:编译期插桩的性能分析
gprof 是GNU工具链自带的性能分析器。它需要在编译时加 -pg 选项,运行程序后会自动生成 gmon.out 文件。
说实话,gprof 现在用得少了。因为它要求程序正常退出才能生成报告,而且对多线程支持不好。但如果你在维护一些老项目,可能还会碰到它。
# 使用gprof
gcc -pg -o myapp myapp.c # 编译时加-pg
./myapp # 运行,生成gmon.out
gprof myapp gmon.out # 查看报告
gprof 输出包含两部分:
- Flat profile:每个函数的调用次数和耗时
- Call graph:函数调用关系图,显示谁调用了谁
Valgrind:内存问题的照妖镜
Valgrind 是个重量级工具,它模拟了一个CPU来运行你的程序。所以...它很慢,程序会慢20-30倍。但它的检测能力也是顶级的。
我最常用的是它的 Memcheck 工具,专门检测内存泄漏、越界访问、使用未初始化内存等问题。记得有次排查一个服务内存持续增长的问题,Valgrind 直接定位到是一个全局变量没有释放,一行代码就修好了。
# Valgrind 常用命令
valgrind --tool=memcheck ./myapp # 内存检测
valgrind --tool=callgrind ./myapp # 函数调用分析
valgrind --tool=helgrind ./myapp # 线程竞争检测
valgrind --tool=lackey ./myapp # 指令计数
我的建议:Valgrind 适合在开发环境用,别在生产环境跑。另外,加上 --leak-check=full 参数可以看到更详细的内存泄漏信息。
FlameGraph:让性能数据一目了然
FlameGraph 是 Brendan Gregg 大神开发的工具。它把 perf 采集的数据变成火焰图,一眼就能看出哪里最热。
为什么叫火焰图?因为颜色从黄到红,越红的区域表示CPU占用越高。你想想看,一个函数在火焰图上占了一大片红色,那肯定就是性能瓶颈了。
# 生成火焰图的完整流程
perf record -F 99 -g ./myapp # 采集数据
perf script > out.perf # 转换为脚本格式
./stackcollapse-perf.pl out.perf > out.folded # 折叠调用栈
./flamegraph.pl out.folded > flame.svg # 生成SVG火焰图
火焰图怎么看?
- X轴:采样数量,不代表时间顺序
- Y轴:调用栈深度,越往上越深
- 颜色:随机分配,没有特殊含义(只是为了区分不同函数)
- 宽条:CPU占用高,重点关注
工具选择指南:什么时候用哪个?
| 问题场景 | 推荐工具 | 我的经验 |
|---|---|---|
| CPU飙高,不知道哪个函数在吃 | perf top | 秒级定位热点函数 |
| 程序启动慢,不知道卡在哪 | strace -c | 看系统调用耗时分布 |
| 内存泄漏,内存只增不减 | Valgrind memcheck | 开发环境跑一次,问题全暴露 |
| 想直观展示性能瓶颈 | perf + FlameGraph | 汇报给领导的神器,一图胜千言 |
| 老项目优化,需要函数级耗时 | gprof | 简单粗暴,但功能有限 |
| 库函数调用异常 | ltrace | 排查第三方库问题很管用 |
嗯,这些工具你不需要一下子全学会。我的建议是:先从 perf 和 strace 入手,这两个最常用。遇到内存问题再上 Valgrind,需要可视化就用 FlameGraph。慢慢来,用多了就熟了。
记住一点:工具只是手段,理解问题本质才是关键。别为了用工具而用工具。