我经营一个网站,为全州高中游泳社区提供服务。我做这个是因为热爱这项运动,所以我不能花一大笔钱来托管等等。我也不需要——除了一年中的一天。
所有教练都通过我的网站提交他们的地区参赛作品,并且通常都等到截止日期才提交。那是昨天,我的网站在整个赛季中从未出现过故障,但一天中至少出现过 4 次无响应停机。它从未出现过超过一小时的故障,而且总是会恢复。(我发出了 apache 重新启动命令以确保万无一失)。
我的问题是:我该如何调整 Apache 来处理一天内激增的用户?如果我只需要一天的提升性能,那么花一年的钱购买更多硬件是没有意义的。我尝试阅读有关 prefork.c 和 worker.c 的内容,但我对它们的理解不够深入。这是我当前的配置:
<IfModule prefork.c>
StartServers 1
MinSpareServers 1
MaxSpareServers 5
ServerLimit 10
MaxClients 10
MaxRequestsPerChild 4000
</IfModule>
<IfModule worker.c>
StartServers 1
MaxClients 10
MinSpareThreads 1
MaxSpareThreads 4
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
我预期的最大同时用户数是 400。但可能远少于这个数字。昨天只有大约 70 个用户,而且性能不佳。有什么建议吗?
更新:
728 root 20 0 317m 20m 7752 S 0.0 2.7 0:49.58 httpd
19700 webuser 20 0 489m 37m 6792 S 0.0 4.9 0:00.72 httpd
19737 webuser 20 0 493m 42m 6624 S 0.0 5.5 0:00.59 httpd
19756 webuser 20 0 494m 43m 6604 S 0.0 5.7 0:00.58 httpd
19758 webuser 20 0 495m 44m 6780 S 0.0 5.8 0:00.97 httpd
19777 webuser 20 0 493m 42m 6620 S 0.0 5.5 0:01.08 httpd
查看了资源,但我不知道自己在看什么。root 拥有的进程应该是运行 Apache 的进程。webuser 拥有的进程是由 Apache 本身生成的吗?为什么它们这么大?服务器大约有 3/4G RAM,如果我为 Apache 计算 1/2,而进程占用 40M,我该如何估计可能同时使用的用户数量?
答案1
鉴于您提供的有关您的环境的详细信息很少,我将尝试勾勒出一些一般规则:
首先,检查你的 Apache 正在使用哪个 mpm 模块,这样你就会知道你需要调整你发布的两个配置块中的哪一个:
apachectl -D DUMP_MODULES | egrep -i "prefork|worker"
如果您处于预分叉模式,并且正在通过 运行某种 php 应用程序
mod_php
,则 Apache 进程随着时间的推移变得庞大的原因是,每次应用程序从客户端收到新请求时,模块都会将越来越多的 php 代码和数据加载到内存中。为了保持进程的大小较小,请尝试降低MaxRequestsPerChild
到 500 左右。每个进程在处理完MaxRequestsPerChild
请求后都会被终止,然后会启动一个新进程(希望它占用的内存更少)。这会以性能为代价,因为新进程将更频繁地重新生成,但由于您试图保持服务运行,而不是使其速度快如闪电,因此这应该是一个可以接受的权衡。您不希望您的 Web 服务器进行交换:确保每个 Apache 进程的最大 RAM 消耗量
ServerLimit
不MaxClients
超过服务器可用内存的 75%。如果可以,请转到 AWS 或类似的云服务提供商:AWS 能够按照预定的时间表自动扩展和缩减您的服务器。在 90% 的实际场景中,“自动扩展”都是骗人的骗术,但您的案例可能是少数几个真正能从该功能中受益的案例之一。您不应该浪费这个机会。
如果你在一台拥有 4GB RAM 的服务器上为 70 个客户端提供服务时遇到了此类问题,我怀疑服务器内部一定出了问题,但你提供的细节不足以让你做出任何有根据的猜测