测量本地主机上各个组件之间的延迟

测量本地主机上各个组件之间的延迟

我需要从系统性能的角度分析 Web 应用程序,并找出典型用户操作(访问主页、登录……)的延迟原因。该网站使用以下组件:

-阿帕奇(为 PHP Drupal 网站提供服务)运行于公共接口上的端口 80
-MySQL(网站数据库)运行于环回端口 3306
-solr(网站用于搜索)正在运行环回端口 8983
-LDAP(网站用于身份验证)运行于环回端口 389
-露天(网站用作 DMS)运行于环回端口 8080

显然,一个解决方案是跟踪对 solr、LDAP、Alfresco 和 MySQL 进行的各种调用的 PHP 代码。我不是 PHP 专家,但这听起来像是一项耗时的任务。

作为替代方案,我考虑了以下几点:由于 Web 应用程序 (apache) 与其他组件 (solr、LDAP、Alfresco、MySQL) 之间的通信发生在环回上,因此我们可以将网络视为延迟源。因此,如果我们将这些组件之间的连接保持打开状态的时间加起来,我们就能很好地了解 Web 应用程序在 solr、LDAP、Alfresco 和 Solr 上花费的时间。这种方法的好处是,从网络的角度来看,无论是 LDAP、MySQL 还是其他组件都没有区别。因此,一旦您找到了测量 1 个组件延迟的方法,就可以将相同的方法应用于其他组件。

Q1:您认为测量网络连接时间是识别延迟来源的好方法吗?或者是否存在任何缺陷(例如保持活动)

如果是这样,一种选择是编写一个 bash 脚本,该脚本tcpdump在输出模式下使用并在[S][F]/[R]标志上使用 grep,并根据 tcpdump 时间戳计算连接开始和结束之间的时间差。 好处是该脚本可以生成一个表格,其中包含每个组件所花费时间的摘要,并且该脚本可以重复用于每个测试。 坏处是编写脚本可能需要很长时间。

Q2:使用该 tcpdump 脚本选项时需要注意什么?

我能想到的另一个选项是使用tcpdump二进制模式 -然后通过设置to 和过滤 tcp并手动计数来w手动查看跟踪。此选项的好处是,我有一个二进制跟踪,我可以查看其他内容,而且我不太可能在时间计算中出错。不好的是,我必须为我所做的每个跟踪手动重复时间计算。wiresharkTime Display FormatSeconds since Previous Displayed PacketSYNACK

Q3:使用 wireshark 选项时需要注意什么?

Q4:您能想到更多查找网络连接时间的方法吗?

答案1

真正做到这一点的唯一方法(无论是本地还是远程)是对每个组件进行分析:

  1. 让 Drupal 打印每次页面生成的开始和结束时间。
  2. 让 MySQL 打印每个查询的时间。
  3. 在每个 solr、LDAP 或 alfresco 请求之前/之后打印“开始”和“结束”时间。

Drupal/Apache 造成的延迟等于总时间减去每个子组件的延迟。MySQL
造成的延迟等于查询持续时间加上一个(相对)常数因子。
其他每个组件造成的延迟等于它们的结束/退出时间减去它们的开始/进入时间。

是的,这样做实际上会使您的应用程序变得更慢,但它也会指出造成最大滞后的组件,以便您可以更深入地研究它们并进行优化。

请注意,在同一系统上运行所有内容也会引入资源(CPU、磁盘、RAM)争用问题,您在考虑分析之前就应该检查这些问题:如果您的系统达到或超过其工作容量,您的结果将永远不会准确。


由网络引起的延迟(尤其是与“您自己”的连接)几乎可以忽略不计——只有在排除所有其他可能性后才可以追踪这些延迟。

相关内容