2026 最全 Linux 性能排查指南:用 perf、strace 与火焰图定位 CPU/内存/IO 瓶颈

perf学习笔记(7)之火焰图 flamegraph 介绍火焰图 阅读详情

摘要:生产环境接口变慢、机器负载高,但瓶颈究竟在 CPU、内存还是 IO?本文把 top/free/iostat/ss 基础四件套与 perf(采样剖析)、strace(系统调用追踪)、火焰图(可视化)串成一套可复用的排查方法论:先粗判方向,再选工具,读图定位根因,最后交叉验证。全文命令均可直接复现,建议收藏。

一、背景:为什么需要 perf、strace 与火焰图

1.1 生产排障的真实困境:"慢"不等于"CPU 满"

一个接口 P99 从 50ms 涨到 800ms,登上去 top 一看:%CPU 可能只有 30%,iowait 却飙到 40%;或者 CPU 看着正常,但 free -h 显示可用内存被吃光、开始 swap。三种典型瓶颈表现完全不同:

  1. CPU 饱和:用户态或内核态占满 CPU,需要定位热点函数;
  2. 内存压力:缺页风暴、缓存未命中率偏高、swap 换入换出;
  3. IO 阻塞:磁盘读写等待、或进程卡在某个网络/文件 syscall。

三者解法完全不同,所以第一步永远是"定方向",而不是上来就盲调。

1.2 三大工具的分工边界

+----------------+    +----------------+    +------------------+
|     perf       |    |    strace      |    |    火焰图        |
+----------------+    +----------------+    +------------------+
| 基于 PMU 的    |    | 系统调用级    |    | 把 perf 采样     |
| 采样剖析       |    | 追踪          |    | 结果可视化       |
| 定位 CPU 热点  |    | 看进程卡在    |    | 调用栈耗费       |
| 与内核态开销   |    | 哪个 syscall  |    | 一目了然         |
| (on-CPU)      |    | (IO/锁/信号)  |    |                  |
+----------------+    +----------------+    +------------------+

  1. perf:基于 Linux perf_events,通过 PMU 硬件计数器与软件事件做采样,擅长定位 CPU 热点与内核态开销(on-CPU 时间)。
  2. strace:系统调用级追踪,擅长看进程"卡在哪个 syscall"——文件 IO、网络 IO、锁、信号都能看到。
  3. 火焰图:不是采集工具,而是把 perf 的采样结果可视化,直观看出时间花在哪条调用栈。

三者关系:perf / strace 负责"采",火焰图负责"看"。

二、工具链准备

perf 随 linux-tools 提供,最好与运行内核版本一致,否则部分硬件事件可能不可用。

```bash
# Debian/Ubuntu:perf 版本需与当前内核对应
apt install -y linux-tools-common linux-tools-$(uname -r) strace

# 校验
perf --version && strace -V && uname -r
```

火焰图由 FlameGraph 脚本集(stackcollapse-perf.pl 与 flamegraph.pl)生成,加入 PATH 即可调用。
端到端数据流:

```
perf record (采样 → perf.data)
   → perf script (导出带调用栈事件流)
   → stackcollapse-perf.pl (折叠相同调用栈)
   → flamegraph.pl (生成 SVG)
   → perf.svg (浏览器打开)
```

容器 / 虚拟化注意点:perf 在容器内需 CAP_PERFMON 或特权,否则多数事件被内核拒绝;strace 同样受 ptrace 权限限制。K8s 环境先确认 Pod 的 securityContext 是否放开相关能力。

三、基础四件套:先定方向(5 秒出结论)

```bash
top -b -n 1 | head -20            # CPU / 负载
mpstat 1 3                        # 每核,重点 %iowait
free -h && vmstat 1 5             # 内存(看 available、si/so)
iostat -x 1 5                     # 磁盘 %util、await
ss -s                             # 网络连数
ss -ant | awk '{print $1}' | sort | uniq -c | sort -rn
```

判定要点:
load / CPU核数 < 0.7 才健康;
free -h 看 available 列,不是 free;
vmstat 的 si/so > 0 或 %wa > 20%,基本锁定内存/磁盘方向。

四、CPU 瓶颈定位(perf + 火焰图)
```bash
# -F 99:每秒采样 99 次(社区惯例,平衡开销与精度)
perf record -F 99 -ag -- sleep 30
perf record -F 99 -p $PID -g -- sleep 30
perf report
perf top -p $PID

# 生成火焰图
perf script | stackcollapse-perf.pl | flamegraph.pl > cpu.svg
```


火焰图读法:横轴是采样总量(越宽越占 CPU),纵轴是调用栈深度,最宽的栈就是最耗 CPU 的路径。
验证要点:采样时间要覆盖业务高峰;-F 过高(-F 999)开销大、污染结果,惯例用 99。

五、内存瓶颈定位

perf stat -e cache-misses,cache-references,page-faults,major-faults \
  -p $PID -- sleep 10
perf record -e page-faults -ag -p $PID -- sleep 10
free -h && vmstat 1 5
cat /proc/meminfo

major-faults(需从磁盘换入的缺页)显著偏高,往往意味着内存压力已逼出 IO;cache-misses 高说明热点数据没留在 CPU 缓存。深度泄漏分析需 jemalloc/jeprof、Valgrind 等。

六、IO 瓶颈定位(strace)

```bash
strace -Ttt -e trace=file,network -f -p $PID    # 逐条看耗时
strace -c -f -p $PID -- sleep 5                 # 汇总统计
iostat -x 1 && pidstat -d 1                     # 系统级印证
```

-T 标出的高耗时 read/write/connect 就是阻塞点。某 connect 每次几百毫秒 → 问题大概率在下游/网络。

七、综合实战:接口变慢决策树

```bash
# 1) 定方向
top -b -n 1 | head -20 && mpstat 1 3
# 2) CPU 热点 + 火焰图
perf record -F 99 -ag -p $PID -- sleep 20
perf script | stackcollapse-perf.pl | flamegraph.pl > cpu.svg
# 3) syscall 层
strace -Ttt -e trace=file,network -f -p $PID -- sleep 5
# 4) 内存 / 缓存
perf stat -e cache-misses,page-faults -p $PID -- sleep 10
free -h && vmstat 1 5
```

典型结论:火焰图最宽栈是序列化函数 → 改代码;strace 显示 connect 高耗时 → 查下游/网络;vmstat 的 si/so 不为 0 → 加内存或查泄漏。

八、避坑与最佳实践

  1. strace 通过 ptrace 显著拖慢目标进程:生产慎用、避免长时间 attach;统计优先用 -c,拿完立刻退出。
  2. perf 采样频率并非越高越好:-F 99 是惯例。
  3. 火焰图只看 on-CPU 时间:进程卡在 IO/锁(off-CPU)时火焰图会"看起来很干净",需 off-CPU 火焰图(perf sched / eBPF),否则漏判。
  4. 环境约束:cat /proc/sys/kernel/perf_event_paranoid 默认多为 2~4,内核态/整机数据需 CAP_PERFMON/CAP_SYS_ADMIN。
  5. 采样要覆盖真实业务高峰,别把偶发抖动当稳定根因。

九、一页速查表(建议收藏)

方向

工具

关键命令

判读

CPU

perf

perf record -F 99 -ag / perf top

火焰图最宽栈

内存

free/vmstat

free -h / vmstat 1

available<10%、si/so>0

内存

perf

perf stat -e page-faults

major-faults 高

磁盘

iostat

iostat -x 1

%util>70%、await>10ms

网络

ss

ss -ant

TIME-WAIT/CLOSE-WAIT 过多

syscall

strace

strace -Ttt -e trace=file,network -p

高耗时 read/write/connect

总结:排查"慢"的核心不是工具多熟,而是先定方向、再选工具、读图定位、交叉验证这条链路走稳。把本文命令与决策树收进自己的排查剧本,下次告警来了就能少绕弯路。

【perf】perf工具的使用&生成火焰图 perf是Linux系统中的一个性能分析工具,它基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析,常用于性能瓶颈的查找和热点代码的定位。:对被检测对象进行采样,最简单的是根据tick中断进行采样,即在tick中断内触发采样点,在采样点中判断程序当时的上下文。perf diff用于比较两个或多个perf.data文件的性能分析结果,帮助开发者快速识别优化前后的性能差异。perf stat 可以查看程序的运行情况,执行该命令时收集性能统计信息. 阅读详情

相关推荐

C++性能分析-perf火焰图

C++使用perf火焰图分析性能

程序喵的博客 2454

【性能】perf + 火焰图分析软件性能瓶颈

一、perf 命令 让我们从 perf 命令(performance 的缩写)讲起,它是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的函数名以及调用栈(stack)。 通常,它的执行频率是 99Hz(每秒99次),如果99次都返回同一个函数名,那就说明 CPU 这一秒钟都在执行同一个函数,可能存在性能问题。 $ sudo perf record -F 99 -p 13204 -g -- sleep 30 上面的代码中,perf record表示记录,-F 99表示每秒9

我的笔记本 1万+

C++:perf详解 + Flame Graph火焰图分析程序性能

因为项目需求,C++和java同时在搞,最近了解到Flame Graph火焰图这个工具,网上查了查资料,这里记录一下。 1 介绍 web site http://www.brendangregg.com/flamegraphs.html git: https://github.com/brendangregg/FlameGraph 火焰图是一个可视化工具,可以将诸多性能检测相...

zzhongcy的专栏 1万+

Linux性能分析工具 - perf 和火焰图

linux 性能分析工具 perf 和火焰图

qazw9600的专栏 5801

C++笔记之linux环境perf生成火焰图

— 2024-04-01 中午。

小勇博客 3182

【工具】使用perf抓取火焰图

perf采集数据生成火焰图

Sunrise的专栏 3261

服务器卡顿之——CPU 性能分析

摘要:本文提供了一套快速诊断服务器CPU性能瓶颈的实操指南,适用于主流Linux发行版。通过60秒诊断命令组合(uptime、mpstat、top等)判断CPU是否饱和,并解读关键指标阈值。详细介绍了定位问题进程/线程的方法,针对不同场景推荐分析工具(如perf、strace等),重点讲解了火焰图生成步骤。最后总结了10大常见CPU高负载原因及应对策略,形成"看负载→核分布→找进程→挖热点→优化"的排查口诀,帮助快速定位80%的CPU性能问题。

likuoelie的博客 370

DNF服务器搭建服务端架设教程

第三步:打开winscp,上传Script.pvf(版本)、publickey.pem(密钥)、df_game_r(等级补丁)到home/neople/game目录下。第四步:打开putty输入./stop,./stop(两次,如果是首次架设不用./stop),./run,运行刚才上传的三个游戏文件。③是本地配置登录器的配置文件,自动生成,可以删除,但是还是会根据你生成的登录器生成这个文件,类似日志。⑤密钥中所上传的三个文件其中之一,重中之重,上传到服务器的密钥必须和登录器中的密钥为一个。

V13807970340的博客 6253

linux开发板(rk3588)性能分析

Linux内核自带的性能剖析工具,可以采样CPU、统计硬件事件(如缓存未命中)、追踪内核/用户态函数调用。,但能显示CPU各个核心、GPU、NPU的实时占用率和频率,而且自身开销极小(<1% CPU)。输出:原始数据(如采样到的函数地址、调用栈、计数),需要人工解析或配合其他工具使用。特点:简单直观,适合第一现场排查,但无法深入到具体程序内部。特点:功能强大但门槛稍高,适合需要精确到代码级的性能调优。分析硬件瓶颈(比如缓存未命中率高,导致CPU空转)。输出:实时刷新的文本界面,直观展示系统级负载。

yasaxile的博客 178

妙算(manifold-2G)通过网线连接笔记本实现静态ip上网

本质就是共享笔记本wifi,配置以太网静态ip,然后在工控机上连接

slender_1031的博客 903

地质建模师必备:用Petrel快速生成浅地层TST/TVT厚度图的5个关键步骤

本文详细解析了地质建模师如何利用Petrel平台,将二维浅地层SEG-Y数据高效转化为真实地层厚度图(TST)和真实垂直厚度图(TVT)。文章系统梳理了从数据规范化导入、坐标系统一、地质界面解释到厚度计算与成图的5个关键实战步骤,并强调了误差控制与工程应用,为海上风电等工程地质评估提供了完整解决方案。

weixin_29204205的博客 517

嵌入式能力跃迁:从STM32驱动到机器人系统韧性构建

嵌入式系统正经历从单点功能实现向全栈系统韧性演进的根本性转变。其核心原理在于:实时性、确定性与跨层协同能力取代了传统外设驱动熟练度,成为价值锚点。技术价值体现在对时序抖动(如≤500μs控制环路)、内存安全(MPU/Cache一致性)、中断确定性(TSN/IRQ路由)等硬约束的工程化解。典型应用场景覆盖四足机器人姿态控制、医疗机器人功能安全认证、AGV运动控制系统等高可靠边缘智能设备。本文聚焦STM32深度硬件掌控与RTOS/Linux系统级调优两大关键跃迁支点,揭示2026年嵌入式工程师能力重估背后的系统

weixin_33755649的博客 233

百度智能云训练图像分割模型+python调用模型并分割图像

目录 训练模型阶段 发布图像分割API 调用图像分割API 创建应用后显示以下两个代码 在pycharm中可以调用API mask解码 依赖库pycocotools安装步骤: 依赖库urllib2的安装 源码下载: 最近上课听老师介绍了一个训练图像分割模型的网站,把数据集上传之后做图像标注,然后进行训练就能得到准确率等指标。 训练模型阶段 图像分割:https://ai.baidu.com/easydl/vision/ 图像分割-->创建模型-->上传数据--&gt

icecreamdinner的博客 1388

C++面试深度指南:从刷题到系统知识,应对米哈游等大厂技术考察

在C++开发领域,掌握语言核心特性和系统底层原理是构建高性能应用的基础。理解虚函数表、智能指针、内存管理等机制,不仅涉及语法层面,更关乎程序运行时效率与资源管理的工程实践。这些知识的技术价值在于,它们直接决定了软件的性能、稳定性和可维护性,是开发游戏引擎、分布式后端、基础软件等复杂系统的关键。在实际应用场景中,如游戏服务器开发或高频交易系统,对C++的深度掌握能帮助开发者优化性能、调试复杂问题。本文围绕C++面试的深度考察,结合**虚函数**和**智能指针**等核心热词,探讨如何超越单纯刷题,构建扎实的知识

weixin_33724659的博客 431

73、结合无人机进行rk3588oak-lite跟踪目标物体进行识别、跟踪

搭建仿真转换模型环境,主要python版本和我下载的rknn2的版本。截取shape节点,输出模型。so库也要对应转模型的whl。其中安装的whl版本。

sxj731533730 1622

手把手教你学simulink(13.2)--构建一个单相并网逆变器Simulink仿真模型

基于Simulink的单相并网逆变器项目的详细仿真实例。这个项目将重点放在逆变器的详细建模、最大功率点跟踪(MPPT)控制策略、并网控制和仿真分析上。我们将使用MATLAB/Simulink来构建整个系统,并通过具体的代码和模块来实现各个功能。

MHD0815的博客 545

perf与火焰图使用介绍

一、介绍 perf是linux上的性能分析工具,perf可以对event进行统计得到event的发生次数,或者对event进行采样,得到每次event发生时的相关数据(cpu、进程id、运行栈等),利用这些数据来对程序性能进行分析。 perf可以统计或采样的event有很多,如果我们要分析cpu,那么我们可以使用cpu-cycles、cpu-clock来衡量占用cpu的程序的分布情况,还可以通过cache-misses、page-faults、branch-misses等event来分析造成cpu占用高的底

cocoti的博客 6890

从零开始学习CANoe(六)—— CAPL 测试节点

创建CAPL Test Module的两种方式

蚂蚁小兵 1万+

perf ⽕焰图

perf 火焰图(Flame Graph)是 Linux 性能分析中常用的一种可视化工具,它基于 perf 采样数据生成,用于直观展示函数调用栈在程序运行过程中所占用的 CPU 时间比例。它能帮助开发者快速发现性能热点(hotspot),从而指导优化。perf 火焰图是基于采样的性能分析工具,它以函数调用栈为纵轴、CPU 时间占比为横轴,宽度越大表示函数消耗的时间越多。通过观察火焰图,可以直观定位程序的性能热点,分析函数之间的调用关系,从而判断瓶颈是来自用户代码、锁竞争、系统调用还是运行时开销。

weixin_46396932的博客 970

Apache DolphinScheduler 实现了对 OceanBase 的元数据库支持

Apache DolphinScheduler 是一款开源的分布式工作流任务调度系统,它提供了可视化的工作流设计和调度功能,支持大数据任务的自动化调度和监控。最近的更新中,Apache DolphinScheduler 引入了对 OceanBase 数据库的元数据库支持,这为用户在大数据环境中管理和调度任务提供了更多选择。用户可以通过 DolphinScheduler 提供的可视化界面进行工作流的设计和调度,也可以通过 DolphinScheduler 提供的 API 进行任务的编程调度。

VavzNvml的博客 490

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

perf工具简介+火焰图制作与解读

perf工具简介+火焰图制作与解读 1、perf工具简单原理 perf是一款Linux性能分析工具。Linux性能计数器是一个新的基于内核的子系统,它提供一个性能分析框架,比如硬件(CPU、PMU(Performance Monitoring Unit))功能和软件(软件计数器、tracepoint)功能。通过perf,应用程序可以利用PMU、tracepoint和内核中的计数器来进行性能统计。它不但可以分析指定应用程序的性能问题(per thread),也可以用来分析内核的性能问题,当然也可以同.

8844

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++ 之 perf+火焰图分析与Debug

perf是Linux下的一款性能分析工具,能够进行函数级与指令级的热点查找。利用perf剖析程序性能时,需要指定当前测试的性能时间。性能事件是指在处理器或操作系统中发生的,可能影响到程序性能的硬件事件或软件事件perf list主要是用于列出有哪些可用的event,可以供来分析。,其中可以列出 hard ware 的event, sw 是software的event, 其它类似。hw/hardware显示支持的硬件事件相关,如: perf list hardware。

lovely_yoshino的博客 6340

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

perf生成火焰图

perf生成火焰图

Yang的博客 9237

使用 perf + FlameGraph 生成火焰图(Flame Graph)笔记

火焰图是一种CPU 采样分析可视化图表程序在CPU 上花时间最多的函数函数的调用栈关系哪些路径是性能瓶颈(Hot Path)perf 负责采样,FlameGraph 负责可视化,火焰图让 CPU 热点一眼可见。

CharlesYuangc的博客 1219

火焰图生成与分析

火焰图的原理和使用方法

you_fathe的博客 4141
上一篇: CLI 还是 MCP?一场关于 Agent 工具接口的再思考
下一篇: 机器学习核心算法全解析:监督学习、无监督学习、神经网络、SVM 一文读懂(附入门路线)
Codiggerworld
博客等级 码龄3年 29粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值