性能分析
性能分析通常从「自上而下」开始:先用宏观工具定位瓶颈所在的子系统(CPU、内存、IO),再针对具体进程采样深入分析。
perf 基础
perf 是 Linux 内核自带的性能分析工具,基于硬件性能计数器与采样:
perf list # 列出可用事件
perf stat ./program # 统计总览(指令数、缓存命中率等)
perf record -g ./program # 采样并记录调用栈
perf report # 交互式查看热点
perf top 实时显示系统中占用 CPU 最多的函数,适合在线诊断。
火焰图
火焰图由 Brendan Gregg 提出,把 perf 采样的调用栈按宽度可视化,宽度越大代表该函数占用 CPU 时间越长。
perf record -F 99 -a -g -- sleep 30
perf script | stackcollapse-perf.pl | flamegraph.pl > flame.svg
常用脚本来自 FlameGraph 仓库。生成的 SVG 可直接在浏览器中放大查看。
系统级监控
| 工具 | 关注点 |
|---|---|
top / htop | 进程 CPU、内存占用 |
iostat -xz 1 | 磁盘 IO、await、util |
vmstat 1 | 内存、交换、上下文切换 |
sar -u 1 | 历史 CPU 数据 |
mpstat -P ALL 1 | 各 CPU 核心使用率 |
iostat 中的 %util 接近 100% 且 await 显著升高,通常意味着 IO 瓶颈。
内存分析
- valgrind --tool=massif:分析堆内存使用峰值,适合长期运行的进程。
- valgrind --tool=memcheck:检测内存泄漏、越界访问、未初始化读取。
- heaptrack:相比 massif 速度更快、报告更直观,是 C++ 项目的常用选择。
valgrind --tool=memcheck --leak-check=full ./program
heaptrack ./program
heaptrack_gui heaptrack.program.*.gz