
perf 是 Linux 内核自带的性能分析利器,无需额外安装(只要内核启用了 CONFIG_PERF_EVENTS),能直接采集 CPU、内存、调度、中断、锁、cache 等多维度底层事件,定位真实瓶颈非常高效。
快速上手常用命令
日常排查建议从这几个命令开始,覆盖大多数场景:
-
perf top:实时查看占用 CPU 最高的函数(类似 top,但基于采样,开销低) -
perf record -g -p <pid></pid>:对指定进程录制调用栈(-g 启用调用图),适合分析慢服务或卡顿程序 -
perf record -e cycles,instructions,cache-misses -a sleep 5:全局采集 5 秒的 CPU 周期、指令数、缓存未命中等关键指标 -
perf report --no-children:查看 record 结果,加--no-children避免调用栈折叠干扰主因识别
识别 CPU 瓶颈的核心技巧
单纯看“CPU 使用率高”没意义,要区分是真计算、频繁上下文切换,还是自旋等待。perf 能帮你拆解:
Magento是一套专业开源的PHP电子商务系统。Magento设计得非常灵活,具有模块化架构体系和丰富的功能。易于与第三方应用系统无缝集成。Magento开源网店系统的特点主要分以下几大类,网站管理促销和工具国际化支持SEO搜索引擎优化结账方式运输快递支付方式客户服务用户帐户目录管理目录浏览产品展示分析和报表Magento 1.6 主要包含以下新特性:•持久性购物 - 为不同的
- 用
perf record -e cpu-cycles,task-clock,instructions,context-switches -a sleep 10对比cpu-cycles / instructions—— 比值明显升高说明 IPC 下降,可能遇到分支预测失败、cache miss 或流水线停顿 - 若
context-switches异常高,配合perf record -e sched:sched_switch查看切换原因,再用perf script追踪谁在频繁唤醒/休眠 - 发现大量
__fget或do_syscall_64占比高?可能是系统调用过载,检查是否在高频读写小文件、频繁创建 socket 等
定位内存与缓存问题
内存类性能问题常表现为延迟高、吞吐低,perf 可结合硬件事件精准定位:
-
perf record -e mem-loads,mem-stores,mem-loads:u,mem-stores:u -a sleep 5:区分用户态内存访问频次,再用perf report -F overhead,symbol,dso看哪段代码触发最多访存 -
perf record -e cache-references,cache-misses -a sleep 5:计算 cache miss ratio(miss / references),超过 1–2% 就值得警惕;若 miss 主要发生在 L1d,则大概率是数据局部性差或数组步长不友好 - 怀疑 TLB 压力大?用
perf record -e dTLB-loads,dTLB-load-misses,miss ratio > 5% 时需检查是否分配了大量小内存块或 VMA 过碎
分析锁竞争与调度延迟
多线程程序卡顿,未必是 CPU 满,更可能是线程在等锁或被调度器延迟:
-
perf record -e sched:sched_stat_sleep,sched:sched_stat_wait,sched:sched_migrate_task -a sleep 5:捕获线程睡眠、就绪队列等待、迁移事件,perf script输出中关注 wait 时间长的线程及其调用栈 - 分析自旋锁?启用内核配置
CONFIG_LOCKDEP和CONFIG_LOCK_STAT后,用perf record -e lock:lock_acquired,lock:lock_contended查看哪些锁争抢激烈 - 想确认是否受 CPU 频率限制?
perf record -e power:cpu_frequency可记录频率变化,配合负载看是否因 thermal throttling 被降频
perf 不依赖符号表也能工作,但加上 debuginfo(如 debuginfo-install kernel-core 或安装对应 -debuginfo 包)后,函数名、行号、内联信息才完整。线上环境可先用 perf buildid-list 记录 build-id,离线用本地 debuginfo 解析,兼顾安全与可读性。










