系统调用硬件性能计数器ubuntu

我正在一个项目上工作,我想在执行文件之前和之后获得系统调用(例如:read())的性能计数器(caching,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使用的一样(它的输出是由你引用的)。

您可以设置hw事件计数(启用内核计数 – easyperf中的PERFMON_EVENTSEL_OS标志),然后读取包装器中perf_read_all当前值,然后运行要配置的函数(syscall),然后读取新的计数器值。 新旧价值的区别在于目标函数成本的估计。 检查这个测试,目标函数是foo

https://github.com/castl/easyperf/blob/master/test.c

你不能测量太小的调用,因为从perf_event_open读取hw计数器是通过几个read系统调用来完成的。 因此,做几个类似的系统调用(循环100或1000),或做系统调用做更多的工作,或者尝试测量读取的开销来获得hw计数器(测量空的'foo'函数来获取开销;然后测量你的目标短函数,然后比较差异。)