目前我使用的是 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. 由于积分不足,无法对此发表评论。