当前位置: 首页 > news >正文

perf分析内存

perf分析内存

明白,我帮你整理一份 Linux perf 内存瓶颈分析完整文档,整合之前的 page-faults、major/minor fault、CPU cache、调度事件、内核 tracepoint 等内容,并兼容 老版本或不支持 kmem tracepoint 的系统。文档系统化,保留所有分析思路、示例和命令模板。


📝 Linux perf 内存瓶颈分析完整文档(兼容老版本)


一、全系统 page-fault 统计分析

示例输出:

             3,061      major-faults                                                 994,940      minor-faults                                                 998,349      page-faults                                                 7.104140044 seconds time elapsed

1️⃣ 数字解释

指标数值含义
major-faults 3,061 硬缺页:页面不在内存,需要从磁盘或 swap 读取 → 内存压力指标
minor-faults 994,940 轻缺页:页面已在内存,只是页表未映射 → 不表示内存不足
page-faults 998,349 总缺页数 = minor + major
  • 统计时间:约 7 秒

  • 每秒大约 430 major-faults140k minor-faults

2️⃣ 内存压力分析

  1. Major faults 很少 → 系统总体内存充足

  2. Minor faults 很多 → 正常页表映射行为,不影响内存容量

  3. 总缺页约 998k → 大部分是轻缺页,系统内存够用


3️⃣ 分析建议

a) 按进程统计 major-faults

perf stat -e major-faults -p <PID>

b) 采样 page-fault 调用栈

perf record -e page-faults -g -p <PID>
perf report

c) 内核内存分配压力(可用 kmem tracepoint,如果内核支持)

sudo perf record -e kmem:kmalloc -a -- sleep 10
perf script

如果 kmem tracepoint 不支持,可跳过,使用 page-fault + sched:sched_switch 代替

d) 调度阻塞 / Off-CPU 分析

perf record -e sched:sched_switch -p <PID> -g -- sleep 10
perf script
  • 频繁被换下且等待时间长 → 内存不足或 I/O 阻塞


二、perf 内存相关事件与解释

类别事件名描述用户态/内核态示例命令
软件事件 page-faults 总缺页 u+k perf stat -e page-faults -p
软件事件 minor-faults 轻缺页 u+k perf stat -e minor-faults -p
软件事件 major-faults 硬缺页 u+k perf stat -e major-faults -p
硬件事件 cache-references CPU cache 访问次数 u+k perf stat -e cache-references -p
硬件事件 cache-misses CPU cache 未命中 u+k perf stat -e cache-misses -p
硬件事件 L1-dcache-load-misses L1 cache load 未命中 u+k perf stat -e L1-dcache-load-misses -p
硬件事件 LLC-load-misses Last Level Cache 未命中 u+k perf stat -e LLC-load-misses -p
内核 tracepoint kmem:kmalloc 内核分配内存 k sudo perf record -e kmem:kmalloc -a
内核 tracepoint kmem:kfree 内核释放内存 k sudo perf record -e kmem:kfree -a
内核 tracepoint mm_page_alloc 内存页分配 k sudo perf record -e mm_page_alloc -a
调度事件 sched:sched_switch 上下文切换 u+k perf record -e sched:sched_switch -p
调度事件 sched:sched_wakeup 任务唤醒 u+k perf record -e sched:sched_wakeup -p

注意:老版本或某些内核可能不支持 kmem / mm_page_alloc tracepoints,可用 sched:sched_switch + page-faults 替代


三、CPU cache 与内存关系

指标描述与内存的关系
cache-references CPU cache 访问次数 CPU 层级 cache,间接影响内存访问延迟
cache-misses CPU cache 未命中 L1/L2 miss 不访问内存,LLC miss 才会访问 DRAM
L1/L2/LLC misses 各级 cache 未命中 LLC miss → 主内存访问 → 内存瓶颈可能
  • cache-misses 主要反映 CPU cache 效率

  • 大量 LLC miss → 可能触发 DRAM 访问,间接说明内存瓶颈


四、一次性采集内存瓶颈模板(兼容老版本 perf)

sudo perf record \-e major-faults,minor-faults,page-faults,\
sched:sched_switch,sched:sched_wakeup,cache-misses,cache-references \-g -a -- sleep 10
perf report

说明:

  • major-faults / minor-faults / page-faults → 缺页统计

  • sched:sched_switch / sched:sched_wakeup → 调度阻塞 / Off-CPU 替代

  • cache-misses / cache-references → CPU cache 效率

  • -g → 调用栈采样

  • -a → 全系统采样

  • sleep 10 → 采样时间,可调整

如果内核支持 kmem tracepoints,可单独加 -e kmem:kmalloc -e kmem:kfree


五、分析思路总结

层级方法指标 / 事件说明
统计级别 perf stat major-faults, minor-faults, page-faults 快速判断缺页情况
函数级热点 perf record + report page-faults / cache-misses / call graph 找出热点函数,分析缺页原因
内核分配压力 kmem:kmalloc / kmem:kfree / mm_page_alloc 内核内存动态分配情况 判断内核内存是否紧张
调度延迟 sched:sched_switch / sched:sched_wakeup 进程阻塞次数与时间 内存不足或 I/O 阻塞的间接指标
Off-CPU / 阻塞 sched events CPU 等待时间 替代 --switch-offcpu,判断阻塞时间

六、结论

  • 单独 perf record -e page-faults 不能直接说明内存不够

  • 结合 major-faults、调度事件、cache miss、内核内存分配 → 可判断性能瓶颈

  • 使用模板命令可一次性采集全套指标,快速定位内存压力和热点函数

  • 老版本 perf 或不支持 kmem tracepoints 的系统,也可以用调度事件 + page-faults + cache 事件替代


如果需要,我可以再帮你画一张 内存瓶颈分析流程图,把:

  • CPU cache → page-fault → major/minor → kmalloc/kfree → Off-CPU → 性能影响

完整串起来,便于快速诊断问题。

你希望我画吗?