免责声明:我是新手,仍然在尝试学习输入/输出。
我有一个在运行Linux的目标系统上运行的可执行文件。我想使用perf来分析/监控其性能随着时间的推移。为了论证,我试图证明我目前从top和collectD测量的CPU利用率可以通过perf监视来替换,这将导致更精细的数据。
由于我们试图获得一段时间的情节,我一直在使用perf record -e cycles -p <pid>
。之后我可以通过perf report
获取数据。
问题:
perf report
的数据,向我展示了摘要
我采取的整个数据集是否正确? perf report -D
,我会获得所有数据的转储。 (正如一个侧面问题,时间戳是ns正确的正常运行时间吗?)现在我假设样本基于可以在perf record
正确设置的频率?我通过获取时间戳的时间增量来遇到问题,并且它似乎以随机间隔记录。 如果这个perf的应用不是它打算做的那么我也想知道为什么不呢?另外,我认为这种类型的分析对所有其他类型的统计数据都很有用,因为您可以及时查明运行代码中出现异常的时间。仅供参考,我正在针对顶部收集1s运行perf。我这样做是因为我想比较顶部输出和性能输出。任何见解都会有所帮助,因为正如我所说,我仍在学习这个强大工具的新手。
(Linux内核版本:3.10.82)
答案 0 :(得分:2)
答案#1
是的。 perf report
会显示收集的跟踪摘要。由perf record
收集的样本将保存到二进制文件中,默认情况下为perf.data
。 perf report
命令读取此文件并生成简明的执行配置文件。默认情况下,样本按照首先采样最多的函数进行排序。但是,您也可以使用此报告进行更详细的分析。
答案#2
理想情况下,您应该使用perf script -D
来获取所有数据的跟踪。时间戳以微秒为单位。虽然在内核中比你指定的内核更新,但在命令行开关(-ns)的帮助下,你也可以用纳秒显示时间。这是来源 -
如果不考虑什么样的&#34; deltas&#34;很难说出来。你收到了吗?请记住,收集样本的时间通常是调整的。有两种方法可以指定采集样本的速率 -
您可以使用perf record (--c for count)
指定收集样本的时间段。这意味着对于您正在测量的事件的每个c次出现,您将获得一个样本。然后,您可以修改采样周期并测试各种值。这意味着,在您测量的事件发生的每两次出现时,计数器将溢出,您将记录样本。
表示采样周期的另一种方法是指定每秒采样的平均速率(频率) - 您可以使用perf record -F
来执行此操作。因此perf record -F 1000
将每秒记录大约1000个样本,并且当与事件对应的硬件/ PMU计数器溢出时将生成这些样本。这意味着内核将动态调整采样周期。并且您将在不同的随机时刻获得采样时间。
您可以在此处查看代码:
How perf dynamically updates time
答案#3
为什么不呢?理想情况下,如果您执行perf report
并且只是进行更深入的分析,您应该获取收集的事件样本数。此外,当您执行perf record
并完成录制样本时,您将在命令行上收到有关与您测量的事件对应的样本数量的通知。 (这可能在您使用的内核模块中不可用,我建议您尽可能切换到更新的Linux版本!)。 样本数应该是原始计数 - 而不是期间。
如果您的时间段为100 - 则表示在整个追踪期间,perf
每100次事件记录一次。这意味着,如果跟踪持续时间总共发生了1000个事件,则perf
大约收集事件1,100,200,300 ...... 1000。
是的,记录的样本不仅来自申请。实际上,您可以使用这样的开关:perf record -e <event-name:u> or <event-name:k>
(u表示用户空间,k表示内核)来记录事件。另外perf
也记录来自共享库的样本。 (有关详细信息,请参阅perf
手册页。)
正如我之前所说,perf report
应该是计算cycles
记录的事件perf
样本数量的理想工具。收集/记录的事件数量并不准确,因为硬件根本无法记录所有cycle
事件。这是因为记录和准备所有事件的详细信息需要内核维护环形缓冲区,当计数器溢出时,它会定期写入。写入缓冲区是通过中断进行的。它们占用了CPU时间的一小部分 - 这个时间丢失了,本来可以用来记录当CPU忙于处理中断时会丢失的事件。尽管如此,你可以通过perf
获得非常好的估计。
<强>结论强>
考虑到我们目前掌握的硬件资源的局限性, perf
特别做了它打算做的事情。我建议通过man-pages为每个命令更好地理解。
<强>问题强>
我假设你在看perf report
。我还假设你在讨论perf report
中的开销%。从理论上讲,它可以被认为是您指定的从最高到最少出现的数据排列。但是,有许多潜在的细节需要考虑和理解才能正确理解输出。它表示哪个函数具有最大的开销(就该函数中发生的事件数而言)。还有一个父子关系,基于哪个函数调用所有函数及其开销之间的函数。请使用Perf Report链接了解详情。
如您所知,事件正在被采样,不计算在内。因此,您无法准确获取事件数量,但您将获得样本数量,并根据收集样本的调整频率,您还将获得事件数量的原始计数(一切应该可用于{ {1}}输出)。