我正在一台 CentOs 6 机器上运行一个 Web 应用程序,该机器有 4GB 内存和 3 个处理器核心(Intel Xeon 2.9 Ghz)。
每天早上 8:30 到 9:30 之间(这与大多数人上班并开始使用该应用程序的时间段相吻合),Apache 会停止接受任何新请求,因为 MaxClients 设置超过了 256(这是默认值)。
在任何给定时间点,我都有 15 位用户使用该应用程序,并且该应用程序的活动时间是上午 8:30 到下午 4:30 之间。
为了尝试了解导致此MaxClients
设置超出的原因,我开始监控我的机器在页面加载期间和加载后向服务器发出的请求数。大约 40 分钟的监控结果如下:
正如所见,我的 Web 应用程序使用 CometChat 允许用户相互交互,并且在页面加载之后,所有活动都来自 CometChat,通过 AJAX 请求获取更新。
刚才我在 shell 中运行了这个命令来获取apache
正在运行的线程数:
pidof httpd | wc -w
结果是:245。在我重新启动 Apache 后,这个数字持续上升。这些进程占用的平均(常驻)内存约为18M
。
245 个进程,每个进程 18M,导致 RAM 使用量超过 4GB。
现在,我的问题是:
- 我的客户(或代表客户的 CometChat)是否发出了太多请求?传输的数据量是否异常高?
- 我该怎么做才能防止
MaxClients
设置被超越?
对我们来说,这是一个流量较低的时期。在接下来的几个月里,流量只会增加。任何帮助都将不胜感激!
答案1
很多时候 httpd 进程仍然存在,但是不响应客户端请求。
您是否尝试过增加 MaxClients 和 ServerLimit 的数量,同时减少 MaxRequestsPerChild ?
如果由于内存原因而无法增加 MaxClients,则尝试将 StartServers 和 MinSpareServer MaxSpareServer 限制为最小值(均为 5 左右)。
降低 MaxRequestsPerChild 的值将使进程循环得更快,但它不允许同时接受更多的客户端,但它将帮助在客户端保持连接的情况下避免拥塞(在 TCP 级别或使用 Keep-Alive)。
您也可以尝试强制关闭 Keep-Alive,以确保每个请求都正确关闭(然后回收)
最后,如果您无法调整并且实际上同时拥有 256 个客户端,那么您应该考虑如何增加内存。