并行运行perf record采集多进程性能数据报资源忙的解决方法
并行执行perf record触发Device or resource busy报错和输出文件冲突无关,本质是x86硬件性能监控单元(PMU)的资源抢占问题:你使用的4.18版本内核配套perf默认会独占硬件PMU计数器资源,同一时间默认仅允许一个perf进程调用硬件PMU采样,多实例同时启动就会触发资源占用报错。
按场景选择对应方法即可:
方法1:追加
--no-inherit参数降低PMU占用
该参数会关闭perf对目标进程后续新建子线程、子进程的事件继承,大幅减少需要占用的PMU计数器数量,多数场景下可直接支持2-3个perf实例并行采样,命令示例:perf record -F 99 -g --no-inherit -o <executable_name_1>.data -- <executable_1 with args> perf record -F 99 -g --no-inherit -o <executable_name_2>.data -- <executable_2 with args>注意:该参数生效后,仅会采集perf启动时目标进程已存在的线程性能数据,进程运行过程中新创建的子进程、子线程不会被纳入采样范围,需要跟踪全进程树的场景不适用该方法。
方法2:使用软件事件采样绕开硬件PMU限制
如果需要保留全进程树采样能力,或者加--no-inherit后仍然报错,可以指定使用cpu-clock软件事件做采样,完全不占用硬件PMU资源,支持任意数量perf实例并行:perf record -F 99 -g -e cpu-clock -o <executable_name_1>.data -- <executable_1 with args> perf record -F 99 -g -e cpu-clock -o <executable_name_2>.data -- <executable_2 with args>注意:软件采样在函数调用栈、CPU占用分布这类常规性能分析场景下精度和硬件采样无明显差异,仅无法采集缓存命中率、分支预测错误率这类硬件相关的性能指标。
方法3:调整内核参数开启硬件事件多路复用
如果必须采集硬件性能事件,可以修改内核参数放开PMU访问限制,内核会自动对多个perf进程的硬件事件做分时复用,无需独占PMU资源:# 临时生效,系统重启后恢复默认配置 sudo sysctl -w kernel.perf_event_paranoid=-1 sudo sysctl -w kernel.perf_event_mlock_kb=20480该方法的缺点是多实例并行时,硬件事件会因为分时调度产生统计误差,并行的perf实例数量越多,误差越大。
内容的提问来源于stack exchange,提问作者Archisman pathak

