我有一个 LAMP 服务器,有时每秒可以处理约 400 个请求,服务器配置如下:
CPU: Intel Quad Core Xeon X3430 (4 x 2.40 GHz, 8MB Cache)
RAM: 16 GB REG ECC DDR3
HD: 500 GB Enterprise Grade SATA II
OS: CentOS 64 Bit (Latest Stable)
Apache2 预分叉配置:
StartServers 128
MinSpareServers 16
MaxSpareServers 64
ServerLimit 1500
MaxClients 1500
MaxRequestsPerChild 10000
在高峰时段,服务器负载非常高,CPU 利用率约为 90%,平均负载约为130
我不确定是服务器硬件限制还是我的 prefork 配置有问题 - 可能是什么问题?
答案1
您允许 Apache 生成最多 1500 个子进程来处理请求(ServerLimit
/ MaxClients
)——难怪您的服务器负载(在运行队列中等待的进程数量)会变得巨大!
对于您在问题中引用的每秒 400 个请求数,我的第一个建议是“将 MySQL 服务器移到它自己的盒子里”,或者更好的选择是:“添加另一个 Web 服务器并平衡您的请求”。
为了帮助您确定如何调整附加服务器的大小,请遵循 HDDP500 在其答案中给出的建议来计算 Apache 进程的平均大小。确定您想要在新服务器上运行多少个 Apache 进程,并确定处理它们需要多少 RAM。记得添加安全裕度(一到两个 GB)。
确定 CPU 需求(速度/核心数)稍微困难一些 - 你需要考虑服务器生成每个页面需要做多少“工作”。类似调试可以帮你解决这个问题,告诉你生成一个页面需要多长时间(你应该在未加载的服务器上以及加载的服务器上执行此测试,但你也应该不是大多数情况下在生产服务器上使用像 XDebug 这样的工具。)
答案2
您的 httpd 进程的平均大小是多少?
当服务器负载不足时运行此命令:
ps -ylC httpd --sort:rss | awk '{sum+=$8; ++n} END {print "Tot="sum"("n")";print "Avg="sum"/"n"="sum/n/1024"MB"}'
这将告诉您 Apache 进程的大致平均大小。
您的 MaxClients 可能太高了。
答案3
查看你的 CPU 中断并查看瓶颈从哪里开始(通过top
);如前所述,调低你的ServerLimit
/是个好主意MaxClients
。
根据您的消耗,这可能会(应该)加快速度,因为您减少了盒子自身 CPU 匮乏的能力。