perf和ftrace定位线上内存问题,核心是遵循“先统计量化,再追踪定性”的路径。perf kmem擅长快速指出“哪里有问题”,而ftrace的跟踪点则能回答“为什么会这样”。
第一步:使用perf kmem量化问题(找出热点)
perf kmem是定位内核内存问题的首选统计工具,它能直接报告各调用点的分配总量和碎片率。
操作命令:
# 记录一段时间的 kmem 事件 perf kmem record -a sleep 30 # 按调用点(caller)和碎片率(frag)排序查看统计结果 perf kmem stat --caller --sort=frag,hit,bytes
结果解读与排查方向:
定位内部碎片热点:输出中如果某个调用点的
Fragmentation百分比显著偏高(例如超过 20%),说明该处申请的内存尺寸与 Slab 缓存提供的实际尺寸不匹配,存在严重的内部碎片。这通常意味着存在不合理的分配尺寸,可以考虑为这类频繁申请的对象创建专属的kmem_cache。定位疑似泄漏点:结合
Hit(分配次数)和Total_alloc(总分配量)排序。如果某个调用点分配极其频繁,且Total_alloc随时间持续线性增长(需对比不同时间窗口的统计结果),即使单次分配不大,也可能是泄漏的源头。
第二步:使用ftrace追踪细节(验证原因)
当perf kmem锁定可疑调用点或发现高阶分配失败时,需用ftrace捕获具体事件来确认根因。
场景一:验证内存泄漏(关联分配与释放)kmem跟踪点包含了ptr(指针)、bytes_req(请求字节)和call_site(调用地址)。可以通过跟踪kmalloc和kfree事件,并对比特定调用点下的分配与释放指针,来判断是否存在“只分配、不释放”的情况。
场景二:定位外部碎片(追踪高阶分配失败)
如果系统大块内存(如巨页)分配失败或性能下降,应启用外部碎片跟踪点:
echo 1 > /sys/kernel/debug/tracing/events/kmem/mm_page_alloc_extfrag/enable
原理:当内核为了满足一个高阶(如 order=9)的连续内存申请,而不得不从更低阶(如 order=0)的列表中获取并拼凑页面时,就会触发此事件。
排查:如果该事件在日志中频繁出现,则明确指示了外部碎片的严重程度。可以进一步查看日志中的
alloc_order和fallback_order字段,fallback_order比alloc_order低得越多,说明碎片化越严重。
工具选择
快速定位热点:先用
perf kmem stat,它像“体检报告”,能快速告诉你哪个指标(碎片率)或哪个调用点(分配量)异常。深入根因分析:锁定目标后,用
ftrace特定事件(如mm_page_alloc_extfrag)或关联kmalloc/kfree,它像“显微镜”,能证实泄漏路径或碎片产生的具体过程。