我阅读了有关 Apachempm-prefork
配置的信息,并尝试调整MaxRequestWorkers
参数。更改前的设置如下:
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 64
ServerLimit 512
MaxRequestWorkers 500
MaxConnectionsPerChild 0
</IfModule>
然后,由于我的应用程序中的并发用户数增加,我决定将连接数MaxRequestWorkers
从 500 增加到 670,并ServerLimit
从 512 增加到 700。幸运的是,通过这些更改解决了连接速度慢的问题。但考虑到 的报告Apache2buddy
,平均进程内存为 16MB,这意味着 apache 可能需要至少 的670*16 ~= 10GB
RAM。而我的服务器只有 4GB 的 RAM。现在,htop
RAM 的使用量约为 2.3GB 和 400MB 交换空间(从 1GB 可用)
- 为什么 apache 实际上没有使用更多内存?
- 对我来说最好的配置是什么?(使用大约 600 个进程)
- 我的配置是否会产生一些不良后果?
所以呢
答案1
请谨慎使用 MaxRequestWorkers 的高值。
正如 Babis 所说“考虑将 MaxRequestWorkers 减少到更接近内存容纳量的数字。”
MaxRequestWorkers * “进程的平均内存使用量” < RAM
在我们的案例中,我们添加了下一个配置,这有助于我们解决高负载问题。(AWS、高达 5Gb RAM、Docker、WordPress + WPML 和其他插件。)一切都很稳定。
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 512
MaxRequestWorkers 500
MaxConnectionsPerChild 5000
</IfModule>
但后来我们添加了 Google 的 Web Stories 插件,网站在创建网络故事时开始在仪表板中崩溃。我们遇到了 502/503 错误,因为它耗尽了内存。使用top
、ps aux
和其他监控工具,我们找到了平均进程 RAM 值。然后我们根据内存计算显着降低了 MaxRequestWorkers,网站开始运行良好且稳定。
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 50
MaxRequestWorkers 50
MaxConnectionsPerChild 1000
</IfModule>
以下是计算示例中的引文。
例如,如果您的 Apache 进程平均消耗(%MEM)为 0.8,且您的服务器 RAM 为 2GB(2048MB),其他应用程序消耗 250MB,而您想留下 +100MB 作为可用内存,那么:
MaxRequestWorkers = (2048MB - 250MB - 100MB) / (0.8 / 100 * 2048MB) = ~ 103
注意:“将 MaxConnectionsPerChild 设置为非零值可限制该进程因(意外)内存泄漏而消耗的内存量。”
答案2
Apache 将为每个请求使用 1 个工作进程。将 MaxRequestWorkers 设置为 500 意味着服务器将能够同时处理最多 500 个请求。每个工作进程都是一个消耗内存的进程,您的计算似乎没有问题,但这并不意味着有 500 个进程在等待而不执行任何操作;Apache 会根据需要创建和删除进程。
更具体地说,Apache 将至少保持MinSpareServers
空闲进程以准备处理请求,最多MaxSpareServers
保持空闲进程。它将根据需要创建/删除空闲进程以满足这些数字。因此,如果流量不足,进程将被删除以释放它们消耗的内存,这就是您看到使用 2.3GB 的原因。
至于不良后果,如果您的服务器流量足够大,需要使用超过 4GB 的足够多进程,它将开始使用磁盘上的交换并显著降低速度。考虑将 MaxRequestWorkers 减少到更接近您的内存可以容纳的数字。