线程绑核场景下perf mem记录内存Load为0问题咨询
问题分析与解决建议
1. 命令参数的核心错误
你混淆了perf mem record的-c参数含义:在3.10内核版本的perf工具中,perf mem record的-c是设置采样触发的事件计数阈值(即每发生N次内存事件就采样一次),而非指定要采样的CPU核心。用它指定core_id_2是完全错误的,直接导致采样逻辑不符合预期。
另外,taskset -c [core_id_1] perf mem record ...会把perf进程本身绑定到core_id_1,这对采样core_id_2上的线程毫无帮助,反而可能干扰采样准确性。
2. 正确的采样命令写法
要采样绑定在core_id_2上的线程,可采用以下两种方式:
- 方式1:启动应用时直接指定采样核心
若需要让应用主线程跑在core_id_1,可拆分命令:perf mem record -C [core_id_2] [executable]# 先启动应用并绑定主线程到core_id_1(线程自身已绑定core2、3) taskset -c [core_id_1] [executable] & # 找到core2对应的线程TID(用ps -T -p <应用PID>查看),再执行采样 perf mem record -t <core2线程TID> - 方式2:应用启动后采样特定线程
先通过ps -T -p <应用PID>找到绑定core_id_2的线程ID(TID),再执行:perf mem record -t <core2线程TID>
3. 解决Load计数为0的问题
错误的参数设置导致perf未正确捕获Load事件,可通过以下步骤修复:
- 手动指定要采样的内存事件,确保Load事件被纳入:
perf mem record -C [core_id_2] -e load,store [executable] - 用
perf mem list查看当前perf支持的内存事件类型,确认load事件是否可用。 - 先验证线程是否真的在执行Load操作:用
perf stat统计核心内存事件:
若该命令能统计到Load计数,说明perf mem的参数需要调整;若仍无计数,需排查应用是否真的在执行预期的文件读取逻辑(比如是否被内核页缓存优化为无实际内存Load的操作)。perf stat -C [core_id_2] -e mem_load_retired.l1_hit,mem_load_retired.l1_miss -p <线程TID>
4. 针对3.10内核的额外提示
3.10内核的perf mem对部分内存事件的支持有限,若上述方法仍无效,可尝试用更通用的perf采样命令分析:
perf record -C [core_id_2] -e cycles,mem:* -g [executable]
采样完成后用perf report查看内存相关事件的分布,确认Load操作的情况。
内容的提问来源于stack exchange,提问作者HCSF
相关产品推荐
相关产品推荐

