Linux怎么使用perf工具分析CPU性能热点函数

夏涛酱_5510

夏涛酱_5510

2026-10-26

540人浏览

原创

perf record + perf report 或 perf script 配合火焰图是定位 CPU 热点函数最可靠的方式;perf top 仅适合快速现场扫描,不可复现、不可追溯,且需注意权限、内核配置、调用栈完整性及结果解读陷阱。

linux怎么使用perf工具分析cpu性能热点函数

直接上结论:perf record + perf report 或 perf script 配合火焰图,是定位 CPU 热点函数最可靠的方式;perf top 只适合快速现场扫描,不能复现、不可追溯。

确认权限和内核配置是否就绪

perf 依赖内核的 perf_events 子系统,很多生产环境默认禁用高精度采样。必须先检查并修复基础配置:

  • sudo sysctl kernel.perf_event_paranoid 返回值应 ≤ 1(常见安全加固会设为 2 或 3);若大于 1,执行 sudo sysctl -w kernel.perf_event_paranoid=-1
  • 确认当前内核版本已启用 perf 支持:zcat /proc/config.gz | grep CONFIG_PERF_EVENTS(若无 /proc/config.gz,查 /boot/config-$(uname -r))
  • 非 root 用户无法采样用户态栈或内核函数,所有 perf record / perf top 命令必须加 sudo

对指定进程采样并保留完整调用栈

只用 -g 参数容易丢栈——尤其 C++/Rust/Go 程序中内联或尾调用频繁时。推荐明确指定调用图解析方式:

Obsidian (Linux)
Obsidian (Linux)

操作 Obsidian 库(纯 Markdown 笔记),并通过 notesmd-cli 实现自动化。

下载
  • 优先用 --call-graph dwarf:从二进制中读取 DWARF 调试信息还原栈,准确率最高,但要求程序或符号包含调试信息(如 ceph-osd-dbg)
  • 备选 --call-graph fp(frame pointer):依赖编译时未关闭 -fno-omit-frame-pointer,C/C++ 默认开启,Go/Rust 需显式加编译选项
  • 避免仅用 -g:它在新内核上默认 fallback 到 fp,但不报错,实际采不到深栈却以为“已采集”
  • 示例命令:sudo perf record -p $(pidof ceph-osd) -F 99 --call-graph dwarf -- sleep 30

解读 perf report 输出的关键陷阱

perf report 文字报告里最容易误判的不是“哪个函数占比高”,而是“这个占比属于用户态还是内核态、属于当前进程还是被调度抢占”:

  • 看第一列符号前缀:[.] 表示用户态函数,[k] 表示内核函数,[g] 是内核 guest 模式(虚拟机中);混在一起时,[k] 占比突增往往意味着锁竞争或 I/O 等待
  • 按 → 键展开调用链后,注意每层右侧的百分比是“该帧在全部样本中出现的比例”,不是“占上一层的比例”——所以顶层函数总和可能远超 100%
  • 若看到大量 __libc_start_main 或 start_thread 占比异常高,大概率是采样频率太低(如用了 -F 10)或进程刚启动/即将退出,样本集中在启动/清理路径
  • 运行 perf report -n 可显示各符号的原始采样次数,比百分比更抗干扰

生成火焰图前必须过滤无关上下文

直接拿 perf script 输出喂给 FlameGraph 脚本,常得到一堆 sys_read、do_syscall_64 这类通用内核路径,掩盖真实业务热点:

  • 先过滤出目标进程的用户态栈:sudo perf script -F comm,pid,tid,cpu,time,period,event,ip,sym,cycles,iregs -F callindent=2 | ./stackcollapse-perf.pl | ./flamegraph.pl > osd-flame.svg
  • 若只想看用户态(排除所有 [k]):perf script | awk '$5 != "[k]" {print}' | ./stackcollapse-perf.pl | ./flamegraph.pl
  • 火焰图横轴不代表时间轴,而是“所有样本合并后的栈频次排序”,所以窄而高的尖峰比宽而矮的平台更值得优先排查
  • 注意:火焰图无法反映函数执行时长分布(比如一个函数平均耗时 1ms,但 99% 样本落在最后 10μs),它只回答“CPU 时间集中在哪条调用路径上”

真正难的不是跑通命令,而是判断“这个热点是真瓶颈,还是只是高频但低延迟的常规路径”。比如 bluestore::onread 在 OSD 中占比 35%,得结合 iostat 和 ceph tell osd.x perf dump 确认是磁盘慢导致反复重试,还是函数本身有算法缺陷——perf 告诉你“在哪”,但“为什么在这”还得靠交叉验证。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

4210

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3573

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

2793

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

6870

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

6502

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

3733

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

3245

4

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

2023.07.25

3479

6

linux查找文件命令
linux查找文件命令

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.31

297

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习