我们有一个LAMP设置,当Apache服务器(MySQL服务器不在这个盒子上)刚刚开始死掉时,它已经运行了半年了。 随着时间的推移,似乎已经开始产生越来越多的进程。 最终它会消耗所有的内存,服务器就会死亡。 我们正在使用prefork。
与此同时,我们只是不断增加内存,并将MaxClients和ServerLimit参数增加到512.但是,我们只是延长了崩溃。 数字仍然缓慢上升。 也许在一天之内,它会达到这个极限。
到底是怎么回事? 我们每秒只有15-20个请求。 我们有1 GB的内存,它不是一半使用。 没有交换。
为什么Apache创build越来越多的stream程? 这几乎就像是有一个泄漏的地方!
数据库框很好,它们不会延迟请求。 我们testing了一些查询一切都很快!
[ 为了别人对这个老问题的绊脚石 …]
快速回答:
检查您的apache2.conf或httpd.conf文件中的KeepAlive设置。 将您的KeepAliveTimeout设置为2-5秒。
细节:
我发现,默认情况下,Apache的KeepAlive on , KeepAliveTimeout设置为15秒。 这意味着单个用户的页面命中将导致服务器等待同一用户请求另一个页面/资源15秒,然后放弃并处理别人的请求。
当用户请求最初的index.html文件时,这个设置是非常有用的,然后稍后将要求链接的CSS,javascript和图像文件。 然而,现代计算机和networking/互联网连接意味着浏览器通常在不到2秒的时间内要求链接的资源。 Apache将为后面的页面提供服务,然后再等15秒,以防用户想要别的东西。 在高stream量的环境下这是非常低效的。
如果您每秒接收15个独特的连接,并且每个连接保持活跃状态15秒…我相信您可以看到事情将会非常迅速地聚集起来。 您将有225个Apache进程启动,其中90%的进程完全空闲,等待另一个页面请求打开连接。
我已经看到了一些build议,将您的KeepAliveTimeout设置为2到5秒之间。 我自己,我有一些服务器设置为2和其他高达5.我不收到同样的系统缓慢下降,当我得到交通峰值了。
在你的httpd.conf文件中,你可能会有一段注释,看起来类似于:
<IfModule mod_status.c> <Location "/server-status"> SetHandler server-status Order deny,allow Deny from all Allow from 127.0.0.1 </Location> ExtendedStatus On </IfModule>
在查看我的一台服务器出现问题时,负载变得太高,我可以看到一个类似的问题……“SS”的线条永远不会太高:
Srv PID Acc M CPU SS ... Request 0-0 22830 1/9/3640 K 2.36 7 ... GET /[].css HTTP/1.1 1-0 79114 0/0/858 W 0.00 121462 ... POST /cgi/[] HTTP/1.1 2-0 22856 0/1/3211 W 0.00 20 ... POST /cgi/[] HTTP/1.1 3-0 22890 0/0/2697 W 0.00 0 ... GET /server-status HTTP/1.0 4-0 79105 0/5/525 W 0.34 121463 ... POST /cgi/[] HTTP/1.1 5-0 22892 1/1/764 K 0.00 6 ... GET /[].js HTTP/1.1 6-0 22893 1/1/449 K 0.00 5 ... GET /[].js HTTP/1.1 7-0 22894 1/1/57 K 0.00 5 ... GET /[].js HTTP/1.1 8-0 22895 1/1/426 K 0.00 4 ... GET /[].js HTTP/1.1 9-0 - 0/0/40 . 0.00 2 ... OPTIONS * HTTP/1.0 10-0 22897 0/0/16 _ 0.00 4 ... OPTIONS * HTTP/1.0 11-0 22898 0/0/8 _ 0.00 4 ... OPTIONS * HTTP/1.0
(您可能需要向下滚动才能看到该表 – 上表将作为整体服务器统计信息,然后显示每个孩子目前正在做什么)
更新 :当然,这假设出了问题。 (根据您的评论每秒只有10-15个请求)。 我还有其他一些服务器,有人在镜像我们的文件,由于文件相当大,有些人已经知道要打开500个带宽不是很高的数据stream,所以会占用1024个连接,但这是完全正常的,不会导致崩溃。
如果你遇到了失控的CGI问题,你可以考虑使用suExec或CGIwrap来限制执行时间,尽pipe使用它们会有开销。
你有足够的互联网带宽服务器的答复? 传入的请求是相当小的,所以如果你最大限度地发挥你的服务器堆积来试图写入networking的任何支路(局域网,广域网,无论什么)。
通过系统的netstat(1)命令检查发送队列。 例如“netstat -nat”并查看发送Q列。 如果你有很多传出的数据队列,这是一个标志,你在networking的某个地方有一个瓶颈(超出你的物理网卡)。