Apache 在高负载下使用 100% 的 CPU,但只使用部分 RAM

Apache 在高负载下使用 100% 的 CPU,但只使用部分 RAM

我正在运行一个网站,该网站在特定时间使用率很高。我在 EC2 Ubuntu 16.04 服务器上运行 apache 2.4,该服务器具有 4 核 CPU、16GB RAM 和 2GB Swap。平均 apache 进程的大小为 35MB(大约)。我已将 KeepAlive 值设置为 ON,并将 KeepAliveTimeout 设置为较低的值 5。

我正在使用 MPM prefork,配置如下:

<IfModule mpm_prefork_module>
        StartServers             5
        MinSpareServers          5
        MaxSpareServers          10
        ServerLimit              350
        MaxRequestWorkers        350
        MaxConnectionsPerChild   20000
</IfModule>

当并发用户数增加时,htop 显示所有 4 个核心都已 100% 利用,但是 RAM 仍然显示仅利用了 1.5 或 2GB,而可用的 15GB。

在此处输入图片描述

为什么不使用更多内存?这种 CPU 使用率正常吗?如果用户数量从这里开始增加,服务器将开始返回 HTTP 522 错误。

附加信息:用于获取值的计算参考自本教程和这个回答关于 ServerFault

我发现一个 apache 进程占用了大约 35MB 的内存。我在 PM2 下运行一个 nodejs(用于 socketio)。MySQL 从 RDS 运行,不在此服务器上。不过,我根据建议的计算减少了一些值:

Available Memory - 14000MB 

(将剩余的 RAM 用于其他用途)

Apache Process usage - 40MB
MaxRequestWorkers = 14000/40 = 350
StartServers 30% of MaxRequestWorkers

(应该是105,但是我觉得太高了。我应该把它设为105吗?)

MinSpareServers 5% of MaxRequestWorkers 

(应为 17)

MaxSpareServers 10% of MaxClients 

(这个值和 StartServers 一样大,而且高达 105 可以吗?)

ServerLimit = MaxRequestWorkers

编辑 我修改了 prefork 配置,使用了建议的计算:

<IfModule mpm_prefork_module>
        StartServers             105
        MinSpareServers          17
        MaxSpareServers          105
        ServerLimit              350
        MaxRequestWorkers        350
        MaxConnectionsPerChild   20000
</IfModule>

我运行了一个脚本,该脚本进行 2 次 API 调用,模拟用户登录并执行 4 次操作。并行运行 20 个这样的脚本,使用新配置仍然会产生较高的平均负载值: 在此处输入图片描述

相关内容