如何在 Linux 服务器上调整 Apache prefork mpm 值

如何在 Linux 服务器上调整 Apache prefork mpm 值

目前我使用的是 Apache/2.4.23 版本,并在 ELB 后面的 Web 服务器上运行多个虚拟主机站点。我的 ELB 下有 4 个实例,每个实例的总 RAM 为 8GB。在这些 Web 服务器上,我没有在 httpd.conf 文件中看到任何 mpm 指令,而我可以在 httpd-mpm.conf 文件(位于 /usr/share/doc/httpd24-2.4.23)中看到 mpm 模块指令的默认值。我的 Web 服务器正在使用 prefork mpm 模块

httpd -V | grep MPM
Server MPM:     prefork

目前,所有 4 个 Web 服务器的可用空间(8GB)只剩下大约 200MB,而且我发现始终有大约 60 个 httpd 进程在运行。以下是指标

[root@ip ~]# ps -ef | grep httpd | wc -l
58

[root@ip ~]# ps -ylC httpd | awk '{x += $8;y += 1} END {print "Apache Memory Usage (MB): "x/1024; print "Average Proccess Size (MB): "x/((y-1)*1024)}'
Apache Memory Usage (MB): 1640.18
Average Proccess Size (MB): 38.1438

[root@ip ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          7986       7755        231         51        114        233
-/+ buffers/cache:       7407        579
Swap:            0          0          0

为了提高服务器性能,我计划使用以下 prefork mpm 指令更新 httpd.conf 文件。我唯一想更改的是将 MaxRequestWorkers 值从 250 更改为 400。

<IfModule mpm_prefork_module>
    StartServers             5
    MinSpareServers          5
    MaxSpareServers         10
    MaxRequestWorkers      400
    MaxConnectionsPerChild   0
</IfModule>

编辑:以下是 httpd-mpm.conf 文件中的默认设置。但我在 httpd.conf 文件中没有看到任何 prefork mpm 模块设置,因此假设我的网络服务器使用的是以下默认值

<IfModule mpm_prefork_module>
    StartServers             5
    MinSpareServers          5
    MaxSpareServers         10
    MaxRequestWorkers      250
    MaxConnectionsPerChild   0
</IfModule>

以下是顶部输出:

top - 13:26:31 up 21:08,  1 user,  load average: 0.27, 0.17, 0.12
Tasks: 201 total,   1 running, 199 sleeping,   0 stopped,   1 zombie
Cpu(s):  0.7%us,  0.3%sy,  0.0%ni, 98.3%id,  0.7%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   8178632k total,  7985364k used,   193268k free,   113336k buffers
Swap:        0k total,        0k used,        0k free,   189448k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
26918 apache    20   0  764m  53m  39m S  0.0  0.7   0:01.65 httpd
24963 apache    20   0  769m  50m  36m S  0.3  0.6   0:01.39 httpd
26026 apache    20   0  769m  49m  34m S  0.0  0.6   0:00.81 httpd
26116 apache    20   0  769m  47m  32m S  0.0  0.6   0:01.06 httpd
25766 apache    20   0  769m  47m  32m S  0.0  0.6   0:00.95 httpd
27620 apache    20   0  769m  47m  32m S  0.0  0.6   0:00.47 httpd
26548 apache    20   0  769m  47m  32m S  0.0  0.6   0:00.66 httpd
27128 apache    20   0  769m  46m  32m S  0.0  0.6   0:01.16 httpd
28247 apache    20   0  769m  46m  31m S  0.0  0.6   0:00.24 httpd
27670 apache    20   0  769m  46m  31m S  0.0  0.6   0:00.32 httpd
27424 apache    20   0  769m  46m  31m S  0.0  0.6   0:00.41 httpd
24378 apache    20   0  763m  46m  33m S  0.0  0.6   0:01.28 httpd
26800 apache    20   0  763m  45m  32m S  0.0  0.6   0:00.75 httpd
27672 apache    20   0  763m  45m  31m S  0.0  0.6   0:00.53 httpd
26614 apache    20   0  762m  45m  33m S  0.0  0.6   0:00.88 httpd
25098 apache    20   0  762m  44m  32m S  0.0  0.6   0:01.20 httpd
26671 apache    20   0  763m  44m  31m S  0.0  0.6   0:00.64 httpd
27635 apache    20   0  763m  44m  31m S  0.0  0.6   0:00.61 httpd
23499 apache    20   0  763m  43m  29m S  0.0  0.5   0:01.77 httpd
26285 apache    20   0  767m  43m  29m S  0.3  0.5   0:00.70 httpd
27868 apache    20   0  761m  42m  31m S  0.3  0.5   0:00.70 httpd
26444 apache    20   0  763m  42m  29m S  0.0  0.5   0:00.73 httpd
26081 apache    20   0  763m  42m  29m S  0.0  0.5   0:00.68 httpd
25467 apache    20   0  763m  42m  29m S  0.0  0.5   0:00.99 httpd
26412 apache    20   0  763m  42m  28m S  0.0  0.5   0:00.53 httpd
27412 apache    20   0  763m  42m  29m S  0.0  0.5   0:00.45 httpd
26720 apache    20   0  763m  42m  29m S  0.0  0.5   0:00.51 httpd
26179 apache    20   0  763m  42m  29m S  0.0  0.5   0:00.59 httpd
25943 apache    20   0  763m  42m  29m S  0.0  0.5   0:00.78 httpd
27570 apache    20   0  763m  42m  28m S  0.0  0.5   0:00.28 httpd
26721 apache    20   0  763m  42m  28m S  0.0  0.5   0:00.46 httpd
27252 apache    20   0  763m  42m  28m S  0.0  0.5   0:00.54 httpd
27408 apache    20   0  763m  42m  28m S  0.0  0.5   0:00.29 httpd
27612 apache    20   0  763m  42m  28m S  0.0  0.5   0:00.36 httpd
27576 apache    20   0  763m  42m  28m S  0.0  0.5   0:00.28 httpd
27668 apache    20   0  883m  41m  28m S  0.0  0.5   0:00.31 httpd
27626 apache    20   0  763m  41m  28m S  0.0  0.5   0:00.32 httpd

我的问题是,这种变化是否会帮助我的网络服务器使用更少的系统内存并有效地处理负载。由于我的 Web 服务器上的可用空间较少,将 MaxRequestWorkers 的值从 250 更改为 400 是否会导致进一步的问题? 有没有更好的解决方案来优化我的服务器上的内存消耗?

答案1

我不确定你为什么会选择 prefork 而不是 worker。因为你已经在使用 Apache/2.4.23。参考:此答案将提倡使用工人, 而且内存和并发效率也很高。

工人

mpm_worker 使用线程 - 这对并发性有很大帮助。Worker 会分拆一些子进程,而这些子进程又会分拆出子线程;与 prefork 类似,如果可能的话,一些备用线程会保持就绪状态,以服务传入的连接。这种方法对 RAM 更友好,因为线程数不会像 prefork 中的服务器数那样直接影响内存使用。它还可以更轻松地处理并发性,因为连接只需等待空闲线程(通常可用)而不是 prefork 中的备用服务器。

PS. 由于积分不足,无法对此发表评论。

相关内容