性能监测与perf

时间:2017-12-01 18:27:41

标签: performance linux-kernel perf

免责声明:我是新手,仍然在尝试学习输入/输出。

我有一个在运行Linux的目标系统上运行的可执行文件。我想使用perf来分析/监控其性能随着时间的推移。为了论证,我试图证明我目前从top和collectD测量的CPU利用率可以通过perf监视来替换,这将导致更精细的数据。

由于我们试图获得一段时间的情节,我一直在使用perf record -e cycles -p <pid>。之后我可以通过perf report获取数据。

问题:

  1. 只显示perf report的数据,向我展示了摘要 我采取的整个数据集是否正确?
  2. 如果我要运行perf report -D,我会获得所有数据的转储。 (正如一个侧面问题,时间戳是ns正确的正常运行时间吗?)现在我假设样本基于可以在perf record正确设置的频率?我通过获取时间戳的时间增量来遇到问题,并且它似乎以随机间隔记录。
  3. 一旦我转储数据,这里没有任何内容真正喊出“这是你的数量!”所以假设转储中的“期间”字段是原始计数。这是真的?这意味着如果句点= 100,我可以假设在那段时间内,我的程序使用了100个循环?另外,我开始觉得这不仅适用于应用程序,而且适用于程序生成的每个库或内核调用。即如果调用malloc,则会记录一个不同的事件,并记录调用周期。总体来说,我如何从事件中获取持续时间或事件+周期数+它实际上来自该字段的事件以获得CPU利用率的真实度量?
  4. 如果这个perf的应用不是它打算做的那么我也想知道为什么不呢?另外,我认为这种类型的分析对所有其他类型的统计数据都很有用,因为您可以及时查明运行代码中出现异常的时间。仅供参考,我正在针对顶部收集1s运行perf。我这样做是因为我想比较顶部输出和性能输出。任何见解都会有所帮助,因为正如我所说,我仍在学习这个强大工具的新手。

    (Linux内核版本:3.10.82)

1 个答案:

答案 0 :(得分:2)

答案#1

是的。 perf report会显示收集的跟踪摘要。由perf record收集的样本将保存到二进制文件中,默认情况下为perf.dataperf report命令读取此文件并生成简明的执行配置文件。默认情况下,样本按照首先采样最多的函数进行排序。但是,您也可以使用此报告进行更详细的分析。

答案#2

理想情况下,您应该使用perf script -D来获取所有数据的跟踪。时间戳以微秒为单位。虽然在内核中比你指定的内核更新,但在命令行开关(-ns)的帮助下,你也可以用纳秒显示时间。这是来源 -

Timestamp

如果不考虑什么样的&#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为每个命令更好地理解。

<强>问题

  1. 我假设你在看perf report。我还假设你在讨论perf report中的开销%。从理论上讲,它可以被认为是您指定的从最高到最少出现的数据排列。但是,有许多潜在的细节需要考虑和理解才能正确理解输出。它表示哪个函数具有最大的开销(就该函数中发生的事件数而言)。还有一个父子关系,基于哪个函数调用所有函数及其开销之间的函数。请使用Perf Report链接了解详情。

  2. 如您所知,事件正在被采样,不计算在内。因此,您无法准确获取事件数量,但您将获得样本数量,并根据收集样本的调整频率,您还将获得事件数量的原始计数(一切应该可用于{ {1}}输出)。