我想了解一些(对我们而言)负载很重的Web服务器遇到的一些服务器性能问题。环境如下:
- Debian Lenny(所有稳定的软件包以及安全更新补丁)
- 阿帕奇2.2.9
- PHP 5.2.6
- Amazon EC2大型实例
我们看到的行为是,Web通常感觉很敏感,但是开始处理请求时会稍有延迟-有时在我们的高峰使用时间中只有一秒钟的时间,有时是2-3秒。在服务器上的实际负载被报告为非常高-通常10.XX或20.xx如报道top
。此外,在这些时间(甚至vi
)在服务器上运行其他操作非常慢,因此负载肯定就在那里。奇怪的是,除了最初的延迟之外,Apache仍然保持了快速响应。
我们使用prefork将Apache配置如下:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
和KeepAlive一样:
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
查看服务器状态页面,即使在这些繁重的时刻,我们也很少遇到客户端限制,通常为80-100个请求以及许多处于keepalive状态的请求提供服务。这告诉我将初始请求的速度排除为“等待处理程序”,但我可能是错的。
Amazon的CloudWatch监控告诉我,即使我们的操作系统报告的负载大于15,我们的实例CPU利用率仍在75-80%之间。
输出示例top
:
top - 15:47:06 up 31 days, 1:38, 8 users, load average: 11.46, 7.10, 6.56
Tasks: 221 total, 28 running, 193 sleeping, 0 stopped, 0 zombie
Cpu(s): 66.9%us, 22.1%sy, 0.0%ni, 2.6%id, 3.1%wa, 0.0%hi, 0.7%si, 4.5%st
Mem: 7871900k total, 7850624k used, 21276k free, 68728k buffers
Swap: 0k total, 0k used, 0k free, 3750664k cached
大多数过程如下所示:
24720 www-data 15 0 202m 26m 4412 S 9 0.3 0:02.97 apache2
24530 www-data 15 0 212m 35m 4544 S 7 0.5 0:03.05 apache2
24846 www-data 15 0 209m 33m 4420 S 7 0.4 0:01.03 apache2
24083 www-data 15 0 211m 35m 4484 S 7 0.5 0:07.14 apache2
24615 www-data 15 0 212m 35m 4404 S 7 0.5 0:02.89 apache2
vmstat
与上述同时输出的示例:
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
8 0 0 215084 68908 3774864 0 0 154 228 5 7 32 12 42 9
6 21 0 198948 68936 3775740 0 0 676 2363 4022 1047 56 16 9 15
23 0 0 169460 68936 3776356 0 0 432 1372 3762 835 76 21 0 0
23 1 0 140412 68936 3776648 0 0 280 0 3157 827 70 25 0 0
20 1 0 115892 68936 3776792 0 0 188 8 2802 532 68 24 0 0
6 1 0 133368 68936 3777780 0 0 752 71 3501 878 67 29 0 1
0 1 0 146656 68944 3778064 0 0 308 2052 3312 850 38 17 19 24
2 0 0 202104 68952 3778140 0 0 28 90 2617 700 44 13 33 5
9 0 0 188960 68956 3778200 0 0 8 0 2226 475 59 17 6 2
3 0 0 166364 68956 3778252 0 0 0 21 2288 386 65 19 1 0
最后,从Apache的输出server-status
:
Server uptime: 31 days 2 hours 18 minutes 31 seconds
Total accesses: 60102946 - Total Traffic: 974.5 GB
CPU Usage: u209.62 s75.19 cu0 cs0 - .0106% CPU load
22.4 requests/sec - 380.3 kB/second - 17.0 kB/request
107 requests currently being processed, 6 idle workers
C.KKKW..KWWKKWKW.KKKCKK..KKK.KKKK.KK._WK.K.K.KKKKK.K.R.KK..C.C.K
K.C.K..WK_K..KKW_CK.WK..W.KKKWKCKCKW.W_KKKKK.KKWKKKW._KKK.CKK...
KK_KWKKKWKCKCWKK.KKKCK..........................................
................................................................
根据我有限的经验,我得出以下结论/问题:
我们可能允许太多
KeepAlive
请求我确实在vmstat中看到了一些时间来等待IO,尽管不一致和不是很多(我想?),所以我不确定这是否是一个大问题,我对vmstat的经验不足
同样在vmstat中,在一些迭代中,我看到一些等待服务的进程,这就是我将Web服务器上的初始页面加载延迟归因于(可能是错误地)的原因。
我们混合使用静态内容(75%或更高)和脚本内容,脚本内容通常占用大量处理器资源,因此在两者之间找到合适的平衡非常重要;从长远来看,我们希望将静态变量移至其他位置以优化两台服务器,但我们的软件目前尚无法满足要求
如果有人有任何想法,我很乐意提供其他信息,另外一点是,这是一个高可用性的生产安装,因此我很谨慎地进行调整,这就是为什么我没有像KeepAlive
自己这样玩的原因然而。