我的网站加载有问题。这是一台亚马逊 ec2 服务器,配有 15GB RAM 和 4 个 CPU,位于 LB 后面。
apachetop 说我每秒收到大约 80 个请求,对于这种类型的服务器来说,这个数字似乎真的很低,负载(由 top 给出)通常约为 15,但在 24 小时内会增加到大约 150。我随时看到大约 100 个活动的 apache 进程。Apache 处于预分叉模式。
服务器上Mysql用的很少,而且几乎没有静态文件。
这是我的 Apache 设置:
Timeout 20
KeepAlive Off
MaxKeepAliveRequests 0
KeepAliveTimeout 3
<IfModule mpm_prefork_module>
StartServers 40
MinSpareServers 25
MaxSpareServers 40
ServerLimit 400
MaxClients 400
MaxRequestsPerChild 4
</IfModule>
有人能建议如何调整设置吗?谢谢!
编辑:配置是通过反复试验获得的。任何(我的意思是数字)更改这些行都会使负载在 5 分钟内飙升。它在几分钟内就跳升到 200-300。特别是 MaxRequestsPerChild。我尝试过 10、15、100、1000,负载却直线上升。
关于 php - 实际上只有几个 php 文件并不那么昂贵。它们只是输出一些简单的东西。
如果我打开 KeepAlive 负载也会进入空间..
编辑:这是服务器状态给出的结果:
Current Time: Monday, 16-Apr-2012 07:26:07 UTC
Restart Time: Monday, 16-Apr-2012 07:06:44 UTC
Parent Server Generation: 3
Server uptime: 19 minutes 22 seconds
Total accesses: 65803 - Total Traffic: 51.8 MB
CPU Usage: u24.25 s1.99 cu0 cs0 - 2.26% CPU load
56.6 requests/sec - 45.7 kB/second - 825 B/request
65 requests currently being processed, 0 idle workers
WWWCWWCCWWWWCCCWWCWWCWCWWCCWWWCCWWWCWWCWWWSWC..C..W...WCCCC.C.GW
CWCC.CWWCCC.WC..................................................
................................................................
................................................................
................................................................
................................................................
................
我可以看到很多连接处于“等待”模式,但我不确定为什么请求/秒如此低。只有 56 个,而且很多插槽都是空的...
更新:我稍微修改了代码,删除了所有可能减慢速度的例程,但每秒仍然只收到 100 个请求。负载稳定在 10 左右...
我认为这类机器应该能够做更多的事情......
答案1
您的情况表明 PHP 脚本正在等待某项操作完成(例如 SQL 查询或 API 调用)。您应该能够打开 apache 的扩展状态模块来更好地了解 apache 正在做什么。
为此,您需要在 httpd.conf 中启用 mod_status 并将“ExtendedStatus On”(参见:http://httpd.apache.org/docs/2.0/mod/mod_status.html#extendedstatus)
例如。
LoadModule status_module modules/mod_status.so
ExtendedStatus On
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from xxx.xxx.xxx.xxx
</Location>
将 xxx.xxx.xxx.xxx 替换为您想要访问状态页面的 IP,然后点击http://yoursite.com/server-status查看输出。大多数配置可能已经在 .conf 文件中,或者已被注释掉。
一旦你可以访问它,你会看到类似以下内容:
K___K_W_........................................................
................................................................
................................................................
................................................................
Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" KeepAlive (read), "D" DNS Lookup, "L" Logging,
"G" Gracefully finishing, "." Open slot with no current process
这让您更清楚地了解 Apache 幕后发生的事情。如果我的第一个假设是正确的(即您的 PHP 脚本正在等待某事),那么您将看到许多任务处于“W”模式。
尝试一下 - 如果您仍然需要帮助,请告诉我上面的输出是什么样的。
答案2
即使 15 的平均负载也太高了 - 这表明系统正陷入瓶颈。
Apache 中运行着什么?
如果是动态内容,请检查 CPU 是否已被完全利用;代码可能需要一些优化,或者您可能需要扩展到更多 EC2 实例来处理内容的 CPU 要求。
如果它涉及客户端加载大量数据,那么您可能会超载磁盘(检查顶部的 iowait 数字)甚至可用带宽。
根据正在运行的内容,您可能能够使用比 prefork 性能更好的 MPM。
MaxRequestsPerChild 4
非常低 - 您知道为什么设置这个吗?为什么要KeepAlive Off
设置?从性能角度来看,这两个设置都非常糟糕;您能介绍一下配置如何达到这个水平吗?