如何识别 Xhprof 的瓶颈?

Posted

技术标签:

【中文标题】如何识别 Xhprof 的瓶颈?【英文标题】:How to identify the bottlenecks with Xhprof? 【发布时间】:2015-09-02 21:16:53 【问题描述】:

我遇到了一个非常慢的 API 调用问题,我想找出它是由什么引起的,使用 Xhprof:默认 GUI 和调用图。应该如何分析这些数据?

在代码中找到应该优化的地方,尤其是最昂贵的瓶颈的方法是什么?

【问题讨论】:

典型的分析器输出 - 让您充满噪音。检查this post.你可以把它当作一个bug,使用php调试器。然后按 Ctrl-C 或 Ctrl-Break 中断它,并显示堆栈。问题将在堆栈上与花费的时间成正比。 【参考方案1】:

在所有这些列中,重点关注名为“IWall%”的第 5 列。 请注意,senddoRequestreadfgets 都包含 72% 的挂钟时间。

这意味着,如果您采集 100 个堆栈样本,每个例程都会在其中的 72 个样本上发现自己,无论是给予还是接受,我怀疑它们会一起出现。 (您的图表也应该显示这一点。)

因此,由于整个过程需要 23 秒,这意味着大约 17 秒用于阅读。 减少这 17 秒的唯一方法是,如果您发现某些阅读是不必要的。可以吗?

剩下的 28%(6 秒)呢? 首先,值得吗? 即使您可以将其减少到零(总共 17 秒,但您不能),加速因子将 1/(1-0.28) = 1.39,或 39%。 如果你可以将它减少一半(总共 20 秒),它将是 1/(1-0.14) = 1.16,或 16%。 20 秒与 23 秒,由您决定是否值得麻烦。

如果你决定是这样,我推荐random pausing 方法,因为它不会让你充满噪音。 它直击问题的核心,不仅告诉您哪些例程,还告诉您哪些代码行,以及它们被执行的原因。 (为什么是最重要的,因为如果绝对必要,你不能替换它。 使用分析器时,您倾向于认为这是必要的,因为您无法判断。)

由于您要花费大约 14% 的时间寻找某样东西,因此您将不得不检查 2/0.14 = 14 个样本,平均来看两次,这将告诉您它是什么。 请记住,这些样本中约有 14 * 0.72 = 10 个将落在fgets(及其所有调用者)中,因此您可以忽略这些样本或使用它们来确保所有 I/O 都是真正必要的。 (例如,您是否有可能因为某种晦涩的原因而阅读了两次,例如这样做更容易?我已经看到了。)

【讨论】:

以上是关于如何识别 Xhprof 的瓶颈?的主要内容,如果未能解决你的问题,请参考以下文章

使用XHProf查找PHP性能瓶颈

使用XHProf分析PHP性能瓶颈

FFMPEG - 如何识别硬件转码的瓶颈?

如何识别阻碍我的程序在 32 核 CPU 上良好扩展的瓶颈? [关闭]

人脸识别或将到达瓶颈,有监督的聚类算法探索新思路

使用 Saxon-JS 识别 XSLT 转换的性能瓶颈