我尝试在启动后 20 秒分析我的应用程序,因为我对初始化阶段不感兴趣。
所以我使用了
perf
和延迟(微秒)开关:
sudo perf stat --delay=20000 -e page-faults my_app
最初我收到错误:
Some events weren't counted. Try disabling the NMI watchdog:
echo 0 > /proc/sys/kernel/nmi_watchdog
perf stat ...
echo 1 > /proc/sys/kernel/nmi_watchdog
所以我尝试了这个:
echo 0 | sudo tee /proc/sys/kernel/nmi_watchdog
错误消失了,但 Perf 没有计算该事件:
<not counted> page-faults
然后我再次尝试,移除延迟开关:
sudo perf stat -e page-faults my_app
并且有效。
使用延时开关时,确实输出
events enabled
。
我使用这个开关是否错误/如何在 N 秒后开始分析?
对我有用。
您的应用程序是否在 20 秒延迟结束之前退出? 在这种情况下,任何计数器都不会计算任何事件。我可以通过在我的系统上大约 3.6 秒后退出的繁忙循环来重现您的症状:
perf stat --delay=20000 -e task-clock,cycles,page-faults \
awk 'BEGIN{for(i=0;i<100000000;i++){}}'
它会在退出时打印
Events disabled
,然后打印 Events enabled
,但对于硬件 (<not counted>
) 和软件(任务时钟和页面错误)事件,都会打印 cycles
。
将延迟减少到
2000
ms(2 秒),它确实计入 3.6 秒运行时间的后半部分:
$ perf stat --delay=2000 -e task-clock,cycles,page-faults awk 'BEGIN{for(i=0;i<100000000;i++){}}'
Events disabled
Events enabled
Performance counter stats for 'awk BEGIN{for(i=0;i<100000000;i++){}}':
1,591.87 msec task-clock # 1.000 CPUs utilized
6,208,241,402 cycles # 3.900 GHz
6 page-faults # 3.769 /sec
1.591902071 seconds time elapsed
3.590486000 seconds user
0.000000000 seconds sys