我正在一个项目上工作,我想在执行文件之前和之后获得系统调用(例如: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'函数来获取开销;然后测量你的目标短函数,然后比较差异。)