Apache 服务器正在生成越来越多的进程,耗尽 RAM 并崩溃

Apache 服务器正在生成越来越多的进程,耗尽 RAM 并崩溃

我们有一个 LAMP 设置,运行了半年,但 Apache 服务器(此机器上没有 MySQL 服务器)开始死机。随着时间的推移,它似乎开始产生越来越多的进程。最终它会消耗所有内存,服务器就会死机。我们正在使用 prefork。

与此同时,我们只是继续增加更多 RAM,并将 MaxClients 和 ServerLimit 参数增加到 512。但我们只是在延长崩溃时间。这个数字仍在缓慢上升。也许一天之内就会达到这个限制。

发生了什么事?我们每秒只有大约 15-20 个请求。我们有 1 GB 的内存,但还不到一半。没有进行交换。

Apache 为何创建越来越多的进程?就好像某处有泄漏!

数据库框很好,它们不会导致请求延迟。我们测试了一些查询,一切都很快!

答案1

[为了让其他人偶然发现这个老问题... ]

快速回答:

检查KeepAliveapache2.conf 或 httpd.conf 文件中的设置。将其设置KeepAliveTimeout为 2 到 5 秒之间。

细节:

我发现默认情况下 Apache 的KeepAlive时间为on,并且KeepAliveTimeout设置为15秒。这意味着单个用户的页面点击将导致服务器等待同一用户请求另一个页面/资源 15 秒,然后服务器才会放弃并处理其他人的请求。

当用户请求初始 index.html 文件,然后在一两秒后请求链接的 CSS、javascript 和图像文件时,此设置非常有用。但是,现代计算机和网络/互联网连接意味着浏览器通常会在不到 2 秒的时间内请求链接的资源。Apache 将提供后续页面,然后再等待 15 秒,以防用户需要其他内容。这在高流量环境中效率极低。

如果您每秒接收 15 个唯一连接,并且每个连接保持活动状态 15 秒...我确信您很快就能看出事情会变得非常严重。您将启动 225 个 Apache 进程,其中 90% 以上完全空闲,等待其打开的连接上的另一个页面请求。

我看到过很多建议将延迟时间设置KeepAliveTimeout为 2 到 5 秒之间。我自己就将一些服务器的延迟时间设置为 2 秒,而将其他服务器的延迟时间设置为 5 秒。当流量激增时,我不再遇到同样的系统减速问题。

答案2

在您的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 个流,所以它会占用所有 1024 个连接,但这完全正常,不会导致崩溃。

如果您遇到失控 CGI 的问题,您可以考虑使用 suExec 或 CGIwrap 来限制执行时间,尽管使用它们会产生开销。

答案3

您是否有足够的互联网带宽来处理响应?传入请求的比例非常小,因此如果您最大化任何一条线路(LAN、WAN 等),您的服务器就会堆积如山,试图写入网络。

通过系统的 netstat(1) 命令检查发送队列。例如“netstat -nat”,然后查看发送 Q 列。如果有大量传出数据排队,则表明网络中某处存在瓶颈(超出物理网卡的范围)。

相关内容