我的 Apache 状态如下;
201 requests/sec - 98.8 kB/second - 504 B/request
85 requests currently being processed, 345 idle workers
_____CCW_C_____C__C__C_R____C_WC_________C__C____CW__C__CCC_____
__C____W______C___C___CW__C_C______C__W_C__C_____CCC____C______R
CC_C_______C___C____C______________C______C__C________________C_
___________________C______________________C_______C___C_____C___
CC____C__C___R_____C_C_CC__________C___C___________R____C_C_C___
______C______W_W__W___C____________________C__WCC__R__R_C_______
R__RC________________________C___R____W__C____..................
....................................................
在 4 核机器上,服务器负载平均为 2。
IO 利用率为 10-15%,并且没有太多超过 70% 的情况。
机器有近 4 GB 的可用空间并且使用 0 个交换空间。
机器上的站点是 PHP 站点。所有 PHP 代码都经过优化,访问速度很快,但有时请求会卡住。卡住的意思是:至少 10 秒内没有响应。我们调试了 PHP 代码,但它非常优化且速度很快。我们花了很多时间,直到我们决定测试以下请求:
<html><body>test</body></html>
test.html 页面。
此静态资源也会像 php 页面“卡住”一样被“卡住”。
考虑到系统的健康状况以及它是一个静态文件的事实,这怎么可能呢?
我测试了网络,但是,当 PHP 在站点监控中显示“缓慢”时,使用 html 测试文件也需要(远远超过)10 秒的时间才能加载;
time lynx -dump http://127.0.0.1/test.html
我们非常想解决这个问题,但似乎无法解决它。
答案1
也许 Apache 用完了文件句柄?您允许它拥有多少个文件句柄?默认的 1024 很快就会成为瓶颈。在 Linux 中,您可以提高/etc/security/limits.conf
文件的限制。
停顿期间是否有很多磁盘活动?如果您启用了 Apache 访问日志和其他非常详细的日志,那么可能是文件系统提交了最新的更改?这不会对 Apache 造成任何影响,但您永远不知道。
为了确保万无一失,请/proc/sys/kernel/random/entropy_avail
在停顿期间查看一下。例如,您可以使用 来查看watch -n1 'cat /proc/sys/kernel/random/entropy_avail'
。如果它显示0
,则表示您的内核已用尽熵,这会阻止 Apache,直到有更多可用熵为止。
如果是这种情况,您可以安装rng-tools
并运行rngd
守护进程,在无法获得真实熵的情况下,它会将半随机数从 /dev/urandom 铲到 /dev/random。
答案2
我还没有深入研究其内部原理,但是根据我的经验和我所听到的...如果 PHP 使用嵌入式模块(libphp5.so
)在 Apache 上运行,那么 Apache 会在每次请求时将 PHP(以及可选的任何共享模块)加载到内存中,即使没有运行 PHP 代码。
考虑使用nginx作为 Apache 前面的反向代理。nginx 在提供静态资源方面速度极快,如果配置正确,可以真正减轻繁忙的 Web 服务器上的负载。为了获得加分,请将 PHP 配置为通过 nginx 中的 FastCGI 运行。请查看本文找出一些原因。这真的是一个很好的方法。上周,我用 Ubuntu 10.04、nginx、spawn-fcgi 和 php-cgi 设置了一个新的 Web 服务器,几乎没花什么时间。顺便说一下,PHP 5.3 与 Ubuntu 10.04 捆绑在一起。