用 perf record + perf report 可准确定位 cpu 热点函数,关键需保障权限(如设 kernel.perf_event_paranoid=-1)、符号(安装 debuginfo 或编译加 -g)和调用链(-g 或 --call-graph dwarf)三环节完整。

直接用 perf record 采样 + perf report 查看调用栈,就能准确定位 CPU 热点函数。关键在权限、符号、调用链三个环节不掉链子。
确认环境与基础权限
多数发行版已预装 perf,先验证可用性:
- 运行
perf --version,有输出即就绪 - 若报
Function not implemented,说明内核未启用CONFIG_PERF_EVENTS=y,需更换或重编译内核 - 非 root 用户常因权限受限失败,临时放开:
sudo sysctl -w kernel.perf_event_paranoid=-1 - 永久生效可写入
/etc/sysctl.conf;云环境(如 AWS EC2)需选用支持 PMU 的实例类型(如 c5/m5)
快速抓取并分析热点函数
对目标进程做带调用栈的采样,60 秒足够覆盖典型波动:
每小时自动在推特搜索中国、加密货币、国际热点、美国热点、特朗普等话题的热度信息,提取前十热点,依据 X 平台真实算法权重(开源代码数据)为每个热点生成高曝光推文或线程。用户提及“推特热点”“Twitter热点”“推特搜索”“热点推文”“生成推文”“社交媒体监控”“Twitter监控”等关键词时触发。
- 获取进程 PID:
pidof myapp或pgrep -f "myapp" - 录制样本:
sudo perf record -p $(pidof myapp) -F 99 -g -- sleep 60(-F 99避免与系统 100Hz 定时器共振;-g是调用链关键) - 生成报告:
perf report -g --no-children按函数名排序,回车可展开调用链;若大量显示[unknown],说明缺少调试符号
补全调试符号确保函数名可见
没有符号,perf 只能显示地址或未知帧,无法定位到具体函数:
- Debian/Ubuntu:
sudo apt install myapp-dbg或安装对应dbgsym包 - RHEL/CentOS:
sudo debuginfo-install myapp(需启用debuginfo仓库) - 自研程序编译时加
-g选项,避免 strip 掉符号表 - 验证是否生效:
readelf -S ./myapp | grep debug应有多个.debug_*段
用火焰图直观锁定“真热点”
文本报告适合查细节,但一眼识别瓶颈靠火焰图:
- 导出折叠栈:
perf script | ./stackcollapse-perf.pl > out.folded - 生成 SVG:
./flamegraph.pl out.folded > flame.svg - 用浏览器打开
flame.svg:横轴宽度 = 采样占比,纵轴深度 = 调用层级 - 顶部宽峰是真正耗时函数;点击任意函数可下钻查看其被谁调用、调用了谁
- 注意:漏掉
-g或未用--call-graph dwarf,火焰图会扁平无层次










