1

当我使用 YJP 在我们自己的产品上做 cpu-tracing profile 时,它​​真的很慢。

该产品在 8GB 堆的 16 核机器上运行,我使用磨床运行一个小负载测试(例如 10 个磨床线程),在分析期间大约有 7~10 步。我有一个脚本来使用分析器启动产品,开始分析(使用控制器 api),然后启动磨床来模拟用户操作。当所有操作完成后,脚本会告诉分析器停止分析并保存快照。

在分析过程中,对于磨床测试中的每个步骤,完成时间超过 100 万毫秒。整个分析通常需要 10 多个小时,只需 10 个磨床螺纹,每个螺纹运行 10 次。如果没有分析器,它会在 500 毫秒内完成。

那么......除了要分析的产品的问题之外,还有什么会影响 cpu 跟踪过程本身的性能吗?

4

2 回答 2

1

上次我使用了 YourKit(v7.5.11,相当旧,当前版本是 12)它有两个 CPU 分析设置:采样和跟踪,后者更快且不太准确。由于跟踪应该更准确,我自己使用它并且还观察到了巨大的减速,尽管声明减速是“平均的”。然而,它远远低于你的结果:从 2 秒到 10 分钟。我的代码是计算引擎的一个片段,几乎没有 IO,没有任何等待,只是读取输入,计算并将结果输出到控制台 - 所以整个减速来自分析器,没有外部影响。

回到您的问题:提到的选项 - 采样与跟踪,会影响性能,因此您可以尝试采样。

现在我想到了:YourKit 可以设置为自动执行某些操作,例如定期或在低内存上创建快照、分析内存使用情况、对象分配,这些措施中的每一项都会使分析速度变慢。也许您应该进行在线会话而不是脚本控制,以了解它的真正作用。

于 2013-05-13T08:54:03.953 回答
0

根据一些Yourkit Doc

尽管跟踪提供了更多信息,但它也有其缺点。首先,它可能会显着减慢被分析的应用程序,因为分析器在每次进入和退出被分析的方法时都会执行特殊代码。分析的应用程序中方法调用的数量越多,打开跟踪时其速度就越低。

第二个缺点是,由于此模式会影响已分析应用程序的执行速度,因此在此模式下记录的 CPU 时间可能不如采样记录的时间。请仅在您确实需要方法调用计数时使用此模式。

还:

使用采样时,分析器会定期查询正在运行的线程堆栈,以估计代码中最慢的部分。没有可用的方法调用计数,只有 CPU 时间。

当您的目标是定位和发现性能瓶颈时,采样通常是最佳选择。通过采样,分析器几乎不会给分析的应用程序增加任何开销。

此外,文档中“CPU 时间”的含义有点令人困惑,因为它还谈到了“挂钟时间”。如果您正在执行任何 I/O、等待、睡眠或任何其他类型的阻塞,重要的是在挂钟时间而不是 CPU 时间获取样本,因为假设阻塞时间无关紧要或不可避免。幸运的是,这似乎是默认设置(尽管仍然有点不清楚):

CPU 采样的默认配置是测量 I/O 方法的 wall time 和所有其他方法的 CPU time。

“使用预先配置的设置...”允许选择这个和其他礼物。(原文如此)

如果您的目标是尽可能快地编写代码,请不要担心调用次数和测量“准确性”;找出大部分时间哪些代码行在堆栈上,以及为什么 更多关于这一切。

于 2013-05-13T19:27:50.697 回答