我已经为 Apache 进程分配了 5GB 内存。
基于每个 Apache 进程平均消耗 42.5MB 的事实,我在我的服务器上进行了如下设置(计算时假设每个进程消耗 50MB 内存):
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 100
MaxRequestsPerChild 0
</IfModule>
现在问题是:
- 我如何确定
StartServers
要设置多少? - 虽然无法设置
Worker mpm
(PHP 等),但负载平衡是否是高流量的最佳选择? - 如何减少 Apache 进程内存?我的网站使用 CDN 向用户提供资产,而服务器最终仅提供 HTML。
我已经在这里阅读了答案,并在 Google 上搜索了大量此类问题,但找不到足够具体的答案。
答案1
注意:大多数 Apache 进程与其父进程/兄弟进程共享大部分内存。您无法轻松计算来自 Apache 进程分配的内存值。您能做的最好的事情是:启动大量 Apache 进程并检查这会如何改变您分配的内存。
1:StartServers 的重要性有限。它表示最初将启动多少个子进程。Min/MaxSpareServers 更为重要。
2:我不明白,你没有说任何关于负载平衡解决方案的事情。如果你想要能够处理高流量,你最好的选择是使用一个工作程序 apache(或者甚至是其他类型的 http 服务器)来提供静态文件服务,以及使用基于 prefork 的(我建议你使用 mpm-itk)来提供动态语言(可能用于 php)。工作程序应该将动态请求转发到基于 prefork 的服务器。这种结构还能够轻松扩展到负载平衡集群解决方案。
3:MayRequestPerChild==0 表示进程永远不会重新启动。因此,如果它们有问题,则永远不会修复,或者如果它们泄漏,也不会得到解决。如果您的系统非常稳定,并且您正在使用仅有的服务端有完美垃圾收集的语言(php不是其中之一!),但我认为,从实际原因来看,最好使用一个大整数值(在大多数情况下,我使用 100 或 500)。注意:与处理 100-500 个请求相比,简单的子进程重启并不昂贵。