如何衡量文件相关系统调用的持续时间?

时间:2018-04-09 20:32:08

标签: linux profiling perf strace

我的应用程序运行异常缓慢。我有理由怀疑这可能是因为某些特定文件的读取和统计信息较慢。

我知道我可以使用strace获取时间信息,但我更喜欢使用perf,因为开销太低了。

Brendan Gregg有一些使用perf的有用示例:

http://www.brendangregg.com/perf.html

但他的第一个系统调用示例仅显示所有调用的聚合时序,我需要按文件计时。他的第二个系统调用示例不包括时序,只显示fd数字,而不是真实路径。

我如何将它拼凑在一起?我希望得到类似于“strace -Tttt -e trace = file”的内容。

如果我可以同时测量周期,则会增加奖励。

1 个答案:

答案 0 :(得分:3)

来自strace -Tttt -e trace=file的输出是跟踪(跟踪工具),而perf通常用作分析工具(按名称聚合在函数中花费的时间 - 默认情况下在perf record中按时或在硬件事件上+ { {1}},perf report模式)或统计工具(在perf top模式下 - 计算程序所有运行时间内的某些事件)。

您应该尝试一些跟踪工具(trace-cmdsysdiglttng,...),或者您可以尝试在跟踪模式中使用perf stat({{1跟踪点和perf随时间输出非聚合日志)

系统调用(perf record)有跟踪点: http://www.brendangregg.com/perf.html#Tracepoints http://www.brendangregg.com/perf.html#StaticKernelTracing

perf script

输出格式为:process_name,pid,[cpu_core],time_since_boot_seconds.microseconds:,tracepoint_name,tracepoint_arguments

syscalls       614

您也可以尝试perf record -e 'syscalls:sys_*' ./program perf script 来记录函数回溯(以获取应用程序的哪个函数执行了系统调用,以及谁调用了此函数;更好地使用调试信息)。

perf作为跟踪工具可能无法解码syscall(tracepoint)参数;跟踪工具(如trace-cmd或lttng)可以更好地解码它们(至少在打开的系统调用中解码文件名)。