我最近关注本指南获取 Web 服务器上站点负载的性能测量结果。
要记录 Apache 处理请求所需的时间,请将其添加到您的 Apache 配置文件中:
LogFormat "%h %D %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
%D 表示您将在访问日志中看到 Apache 处理请求所用的时间。该时间以微秒为单位。
为了更轻松地调试页面加载时间,请将其添加到您的配置文件中:
Header set X-Request-Received: %t Header set X-Request-Processing-Time: %D
请记住先通过执行 a2enmod headers 启用 mod_headers。现在您应该在响应中看到这些标头:
X-Request-Received t=1286995673038485 X-Request-Processing-Time D=251
我使用了上述代码(在 .htaccess 中定义了标头),但对于同一请求,日志中出现了“525151”,而标头中出现了“262”。总体而言,这两个数字之间似乎存在数量级的差异
192.0.2.1 525151 - - [21/Aug/2011:14:19:53 +0200] "GET /images/site/slide-1.png HTTP/1.1" 262 423285 "http://example.com/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1"
对阵
X-Request-Processing-Time:D=262
X-Request-Received:t=1313929193502879
我怎样才能解决这个问题?
答案1
您能否验证您的 LogFormat 名称“组合”是否与您的 CustomLog 变量所使用的名称匹配。我在 OS X 上对此进行了测试,除了在写回标题时读取变量与在记录时(将所有数据发送回客户端后)读取变量之间可能存在的细微差异外,它们非常接近:
/etc/apache2# grep LogF httpd.conf
LogFormat "%h %l %u %t \"%r\" %>s %b %t %D" common
/etc/apache2# grep CustomL httpd.conf
# a CustomLog directive (see below).
CustomLog "/private/var/log/apache2/access_log" common
# wget -qqO /dev/null -S http://localhost/
...
X-Request-Received: t=1314588821970347
X-Request-Processing-Time: D=336
/private/var/log/apache2# tail access_log
::1 - - [28/Aug/2011:20:33:41 -0700] "GET / HTTP/1.0" 200 44 [28/Aug/2011:20:33:41 -0700] 587
答案2
我认为最好的选择可能是为自定义 LogFormat 选择一个“合适”的名称,而不是重复使用/更改combined
日志格式。
除此之外(正如@polynomial 所建议的),似乎您显示的配置与您显示的输出之间存在差距。
如果只是为了使故障排除不那么模棱两可(目前,您不知道是否正在使用默认值combined
( )或您的版本)。LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
所以我首先会做类似的事情:
LogFormat "%h %D %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" perf-combined
然后在需要的地方使用 perf-combined。
通过查看@polynomial 示例中 Header %D 和 AccessLog %D 值之间的相当大的差异,我还想知道这两者是否实际上代表了请求处理中的两个不同点:
- 由于本页所有示例中 %D 的标头值都较低,因此它可能显示了形成响应标头所花费的时间,但不一定是响应主体
- AccessLog 的 %D 值可能是发送完整响应的时间。
但这完全只是猜测。
答案3
[这是一个非常老的问题,但值得为到达这里的其他人提供更好的答案]
HTTP 标头必须在内容交付给最终用户之前生成,因此它不包括网络延迟。另一方面,access_log 条目是在所有内容交付给最终用户之后写入的(可能通过较慢的网络链接),它包括交付所花费的时间。
哪个数字对你更有用取决于你想找出什么。对于你的图片 URL,你可能正在查看最终用户的性能,而网络延迟可能是主要答案。
如果您正在调试动态生成内容的性能,您可能希望记录不包括网络延迟的时间。LogFormat 将允许您记录标头的内容%{X-Request-Processing-Time}i
- 还没有尝试过,但我希望它会起作用。