如何优化 prefork mpm 以适应高流量?

如何优化 prefork mpm 以适应高流量?

我已经为 Apache 进程分配了 5GB 内存。

基于每个 Apache 进程平均消耗 42.5MB 的事实,我在我的服务器上进行了如下设置(计算时假设每个进程消耗 50MB 内存):

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          100
    MaxRequestsPerChild   0
</IfModule>

现在问题是:

  1. 我如何确定StartServers要设置多少?
  2. 虽然无法设置Worker mpm(PHP 等),但负载平衡是否是高流量的最佳选择?
  3. 如何减少 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 个请求相比,简单的子进程重启并不昂贵。

相关内容