mpm-prefork apache 增加 MaxRequestWorkers 不会对我的 RAM 造成太大影响

mpm-prefork apache 增加 MaxRequestWorkers 不会对我的 RAM 造成太大影响

我阅读了有关 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 ~= 10GBRAM。而我的服务器只有 4GB 的 RAM。现在,htopRAM 的使用量约为 2.3GB 和 400MB 交换空间(从 1GB 可用)

  1. 为什么 apache 实际上没有使用更多内存?
  2. 对我来说最好的配置是什么?(使用大约 600 个进程)
  3. 我的配置是否会产生一些不良后果?

所以呢

答案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 错误,因为它耗尽了内存。使用topps 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 减少到更接近您的内存可以容纳的数字。

相关内容