系统调用硬件性能计数器 ubuntu
system call hardware performance counters ubuntu
我正在做一个项目,我想获取文件执行前后系统调用(例如:read())的性能计数器(缓存、TLB 等)值。
我尝试在 Ubuntu 上使用 perf 来执行此操作,但无法获得任何结果。有没有办法使用 perf 或其他工具来做到这一点?
感谢您的帮助。
3.329057 task-clock (msec) # 0.714 CPUs utilized
16 context-switches # 0.005 M/sec
0 cpu-migrations # 0.000 K/sec
257 page-faults # 0.077 M/sec
1,983,212 cycles # 0.596 GHz
1,352,902 stalled-cycles-frontend # 68.22% frontend cycles idle
1,080,180 stalled-cycles-backend # 54.47% backend cycles idle
1,336,919 instructions # 0.67 insns per cycle
# 1.01 stalled cycles per insn
267,730 branches # 80.422 M/sec
<not counted> branch-misses
0.004663489 seconds time elapsed
在计数模式下,perf_event_open 有一个小包装库 https://github.com/castl/easyperf,就像 perf stat
使用的一样(它的输出被你引用了)。
您可以设置硬件事件计数(启用内核计数 - PERFMON_EVENTSEL_OS easyperf 中的标志),然后在包装器中读取计数器 perf_read_all
的当前值,然后 运行 您的您要分析的函数(系统调用),然后读取新的计数器值。新旧值之间的差异是目标函数成本的估计。检查这个测试,目标函数是 foo
:
https://github.com/castl/easyperf/blob/master/test.c
您无法测量太小的调用,因为从 perf_event_open
读取硬件计数器是通过多个 read
系统调用完成的。所以,做几个类似的系统调用(100 或 1000 的循环),或者做更多工作的系统调用,或者尝试测量读取的开销以获得硬件计数器(测量空 'foo' 函数以获得开销;然后测量你的目标短函数,然后比较差异。)
我正在做一个项目,我想获取文件执行前后系统调用(例如:read())的性能计数器(缓存、TLB 等)值。
我尝试在 Ubuntu 上使用 perf 来执行此操作,但无法获得任何结果。有没有办法使用 perf 或其他工具来做到这一点?
感谢您的帮助。
3.329057 task-clock (msec) # 0.714 CPUs utilized
16 context-switches # 0.005 M/sec
0 cpu-migrations # 0.000 K/sec
257 page-faults # 0.077 M/sec
1,983,212 cycles # 0.596 GHz
1,352,902 stalled-cycles-frontend # 68.22% frontend cycles idle
1,080,180 stalled-cycles-backend # 54.47% backend cycles idle
1,336,919 instructions # 0.67 insns per cycle
# 1.01 stalled cycles per insn
267,730 branches # 80.422 M/sec
<not counted> branch-misses
0.004663489 seconds time elapsed
在计数模式下,perf_event_open 有一个小包装库 https://github.com/castl/easyperf,就像 perf stat
使用的一样(它的输出被你引用了)。
您可以设置硬件事件计数(启用内核计数 - PERFMON_EVENTSEL_OS easyperf 中的标志),然后在包装器中读取计数器 perf_read_all
的当前值,然后 运行 您的您要分析的函数(系统调用),然后读取新的计数器值。新旧值之间的差异是目标函数成本的估计。检查这个测试,目标函数是 foo
:
https://github.com/castl/easyperf/blob/master/test.c
您无法测量太小的调用,因为从 perf_event_open
读取硬件计数器是通过多个 read
系统调用完成的。所以,做几个类似的系统调用(100 或 1000 的循环),或者做更多工作的系统调用,或者尝试测量读取的开销以获得硬件计数器(测量空 'foo' 函数以获得开销;然后测量你的目标短函数,然后比较差异。)