我有一个在 RHEL 5.3 上运行的 Apache httpd 服务器。我使用此服务器为在另一个 httpd 实例上运行的网站提供静态内容(图像)。在公共 Web 目录中有几张图片,仅此而已。启动一段时间后,服务器向浏览器提供图像的速度变得非常慢,并且在尝试提供 16x16 png 时经常会挂起几分钟。
调试该问题的最佳方法是什么?
我已经跑了顶部在机器上检查是否有足够的可用内存和 CPU。机器不会进入交换状态,当通过浏览器请求图像时,httpd 进程仅占用 CPU 和内存几秒钟。然而,图像通常在几分钟后才会返回。
重新启动 httpd 进程可解决该问题,并且图像可快速加载。
这似乎是最简单的 Web 服务器设置。问题可能出在哪里?
谢谢
更新:httpd.conf 设置:
Timeout 10
KeepAlive On
MaxKeepAliveRequests 150
KeepAliveTimeout 15
ServerLimit 3
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
答案1
几个问题:
您是否对 Apache.conf 文件进行过任何调整?您使用的是哪个 Apache MPM?
Apache.conf 文件中当前设置了哪些参数:
Timeout
KeepAlive
MaxKeepAliveRequests
KeepAliveTimeout
MinSpareServers
MaxSpareServers
StartServers
MaxClients
MaxRequestsPerChild
答案2
诊断建议:
您已经检查了 CPU 和内存,但最好也观察一下磁盘带宽和其他统计数据(我建议使用 dstat -af)。您要查找的内容包括大量磁盘读取或写入、大量上下文切换或中断,以及服务器启动和出现问题时的行为之间变化很大的其他测量值。
要检查的另一件事是弄清楚行为是否是时间流逝的函数,还是请求数量的函数,或者两者兼而有之?
- 启动服务器,几个小时不请求任何图片,然后请求一张图片,请求快吗,还是?
- 启动服务器,尽可能快地请求图像(使用环回以避免网络延迟)并查看达到某个预定的缓慢程度(例如 10 秒响应)需要多长时间
测试是否是网络问题。当服务器出现问题(例如 10 秒响应)时,通过环回接口请求图像。如果返回速度很快,请查看网络。如果速度很慢,您可能可以忽略主机外部的网络问题。
答案3
使用mod_status检查和监控服务器状态。我猜大多数连接都在 KeepAlive 状态中等待。您可以尝试将其关闭或降低到较低的值,例如 KeepAliveTimeout 4。