我正在运行一个网站,该网站在特定时间使用率很高。我在 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 个这样的脚本,使用新配置仍然会产生较高的平均负载值: