我正在对运行 Amazon Linux 的 m3.medium ec2 实例上的 LAMP 堆栈中的 apache 服务器进行调整。
几周前,mysql 开始一直崩溃,似乎是 apache (2.2) 的内存问题导致了这个问题。我们做了一些分析,并将配置更改为更少的服务器数量。这解决了 mysql 问题,但在圣诞节期间,流量水平要低得多,从那时起,我们一直在逐渐增加服务器数量,以尝试找到服务器的最佳水平。
Apache 现在表现出一种意外的行为。经过一段时间后,需要很长时间才能处理新请求(几分钟),当我检查 top 等时,当这种情况发生时,CPU 使用率可能低至 0%,但总是很低,就像 Apache 什么也没做一样。top 读数中有一堆 Apache 进程,但它们似乎什么也没做。我尝试关闭 KeepAlive 以防它们被这样束缚,但没有任何变化。
我们仍在使用 prefork MPM(正在设置新服务器以更改此设置)配置如下
StartServers 10
MinSpareServers 10
MaxSpareServers 30
ServerLimit 40
MaxClients 40
MaxRequestsPerChild 2000
KeepAlive Off
有人能帮我了解发生了什么吗?我对 Apache 的了解太有限,无法理解哪里出了问题,但我的直觉告诉我,apache 进程不知何故被束缚住了。我尝试查看 mod_status,但在这种情况下它不起作用,因为请求在那里等待 apache 响应。目前,我不得不定期重置 apache,这远非理想。我在下面提供了一些监控输出,希望它们能让我了解发生了什么或下一步应该查看什么。
非常感谢。
免费输出:
total used free shared buffers cached
Mem: 3578 3481 96 0 22 550
-/+ buffers/cache: 2909 669
Swap: 1023 226 797
顶部输出
top - 10:35:15 up 12 days, 14:14, 2 users, load average: 0.00, 0.00, 0.00
Tasks: 189 total, 1 running, 188 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 3664028k total, 3559768k used, 104260k free, 21076k buffers
Swap: 1048572k total, 232500k used, 816072k free, 559268k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
19973 apache 20 0 1042m 346m 271m S 0.0 9.7 1:17.08 httpd
19964 apache 20 0 1030m 327m 266m S 0.0 9.2 1:11.35 httpd
19970 apache 20 0 1019m 316m 265m S 0.0 8.9 0:59.22 httpd
19981 apache 20 0 1034m 316m 249m S 0.0 8.8 1:10.28 httpd
19962 apache 20 0 1103m 312m 176m S 0.0 8.7 1:15.58 httpd
19966 apache 20 0 1040m 306m 233m S 0.0 8.6 1:24.83 httpd
19971 apache 20 0 1037m 304m 235m S 0.0 8.5 1:03.00 httpd
20848 apache 20 0 1023m 304m 248m S 0.0 8.5 1:11.44 httpd
19969 apache 20 0 1022m 303m 248m S 0.0 8.5 1:06.99 httpd
2199 mysql 20 0 929m 299m 7656 S 0.0 8.4 2137:27 mysqld
27961 apache 20 0 1162m 288m 195m S 0.0 8.1 0:33.04 httpd
19968 apache 20 0 1049m 275m 194m S 0.0 7.7 1:09.61 httpd
20846 apache 20 0 1027m 272m 212m S 0.0 7.6 1:08.45 httpd
30931 apache 20 0 1062m 270m 177m S 0.0 7.6 0:21.48 httpd
21038 apache 20 0 1049m 269m 187m S 0.0 7.5 1:03.50 httpd
19984 apache 20 0 1023m 267m 211m S 0.0 7.5 1:01.80 httpd
19960 apache 20 0 1060m 259m 166m S 0.0 7.3 1:01.87 httpd
19972 apache 20 0 1025m 258m 202m S 0.0 7.2 1:01.66 httpd
19965 apache 20 0 1031m 256m 192m S 0.0 7.2 1:05.59 httpd
19963 apache 20 0 1022m 248m 192m S 0.0 6.9 0:55.78 httpd
19961 apache 20 0 1037m 247m 177m S 0.0 6.9 1:18.43 httpd
30934 apache 20 0 1019m 242m 189m S 0.0 6.8 0:07.20 httpd
30932 apache 20 0 1062m 233m 140m S 0.0 6.5 0:09.04 httpd
24211 apache 20 0 1020m 230m 177m S 0.0 6.4 0:39.03 httpd
19974 apache 20 0 1020m 227m 174m S 0.0 6.4 1:14.78 httpd
31298 apache 20 0 1015m 215m 168m S 0.0 6.0 0:05.64 httpd
406 apache 20 0 1146m 181m 94m S 0.0 5.1 0:08.68 httpd
31297 apache 20 0 1033m 161m 96m S 0.0 4.5 0:08.05 httpd
408 apache 20 0 1020m 139m 86m S 0.0 3.9 0:02.53 httpd
1370 apache 20 0 1041m 136m 53m S 0.0 3.8 0:02.26 httpd
1372 apache 20 0 1019m 125m 73m S 0.0 3.5 0:01.01 httpd
1392 apache 20 0 1041m 111m 37m S 0.0 3.1 0:02.18 httpd
1402 apache 20 0 1107m 100m 52m S 0.0 2.8 0:00.33 httpd
1542 apache 20 0 1013m 97m 51m S 0.0 2.7 0:00.88 httpd
1362 apache 20 0 999m 92m 52m S 0.0 2.6 0:01.03 httpd
1424 apache 20 0 997m 91m 53m S 0.0 2.6 0:00.60 httpd
1410 apache 20 0 997m 91m 53m S 0.0 2.6 0:00.38 httpd
407 apache 20 0 1019m 91m 39m S 0.0 2.6 0:01.17 httpd
1427 apache 20 0 997m 91m 52m S 0.0 2.6 0:00.57 httpd
1371 apache 20 0 1013m 83m 37m S 0.0 2.3 0:00.31 httpd
1541 apache 20 0 981m 57m 34m S 0.0 1.6 0:00.17 httpd
32187 root 20 0 967m 26m 17m S 0.0 0.7 0:02.49 httpd
sar -u 的输出
06:10:01 AM all 18.23 0.00 2.03 2.42 15.23 62.09
06:20:01 AM all 50.85 0.00 2.84 0.46 40.40 5.45
06:30:02 AM all 48.69 0.00 2.76 0.63 38.56 9.35
06:40:01 AM all 47.25 0.00 2.85 1.60 37.61 10.70
06:50:02 AM all 50.16 0.00 3.52 0.57 40.73 5.03
07:00:01 AM all 47.51 0.00 2.76 0.75 37.77 11.21
07:10:01 AM all 35.43 0.00 2.65 1.73 28.79 31.40
07:20:02 AM all 19.84 0.00 2.10 2.21 16.67 59.19
07:30:02 AM all 24.34 0.00 2.30 2.28 20.17 50.91
07:40:02 AM all 18.45 0.00 1.66 1.97 15.14 62.78
07:50:01 AM all 22.23 0.00 2.32 2.92 18.55 53.98
08:00:02 AM all 19.60 0.00 1.98 2.31 16.21 59.90
08:10:02 AM all 18.17 0.00 2.00 3.72 15.07 61.04
08:20:01 AM all 13.80 0.00 1.72 3.27 11.73 69.48
08:30:01 AM all 11.79 0.00 1.50 3.40 10.03 73.28
08:40:01 AM all 16.59 0.00 1.95 2.73 14.02 64.71
08:50:01 AM all 18.04 0.00 1.96 2.37 15.26 62.38
09:00:02 AM all 17.94 0.00 2.16 2.79 15.20 61.91
09:10:01 AM all 4.97 0.00 0.82 1.07 4.46 88.69
09:20:01 AM all 0.18 0.00 0.28 0.19 0.50 98.85
09:30:01 AM all 0.13 0.00 0.19 0.05 0.41 99.21
09:40:01 AM all 0.17 0.00 0.19 0.07 0.43 99.14
09:50:01 AM all 0.13 0.00 0.21 0.03 0.45 99.18
10:00:02 AM all 0.17 0.00 0.23 0.05 0.47 99.08
10:10:02 AM all 0.14 0.00 0.20 0.04 0.44 99.18
10:10:02 AM CPU %user %nice %system %iowait %steal %idle
10:20:01 AM all 0.16 0.00 0.24 0.03 0.49 99.08
10:30:01 AM all 0.14 0.00 0.21 0.03 0.43 99.19
Average: all 19.78 0.03 1.78 2.19 16.21 60.01
sar -r 的输出
06:00:02 AM 135820 3528208 96.29 194768 1170836 2544680 54.00
06:10:01 AM 140220 3523808 96.17 196932 1174256 2531460 53.72
06:20:01 AM 133368 3530660 96.36 199088 1180468 2534200 53.77
06:30:02 AM 75624 3588404 97.94 201796 1187420 2590456 54.97
06:40:01 AM 56112 3607916 98.47 201388 1138840 2669548 56.65
06:50:02 AM 83040 3580988 97.73 195960 1120028 2659192 56.43
07:00:01 AM 56500 3607528 98.46 198812 1128004 2688464 57.05
07:10:01 AM 82508 3581520 97.75 201584 1080180 2699568 57.28
07:20:02 AM 118984 3545044 96.75 204008 1061088 2681724 56.91
07:30:02 AM 48180 3615848 98.69 206580 1053828 2757888 58.52
07:40:02 AM 98828 3565200 97.30 208404 1010216 2752216 58.40
07:50:01 AM 53364 3610664 98.54 181868 961276 2943300 62.46
08:00:02 AM 72516 3591512 98.02 132032 820096 3182764 67.54
08:10:02 AM 97400 3566628 97.34 81824 793872 3254192 69.05
08:20:01 AM 105988 3558040 97.11 77336 796660 3239836 68.75
08:30:01 AM 110324 3553704 96.99 71368 805276 3242836 68.81
08:40:01 AM 89500 3574528 97.56 79736 814620 3255128 69.07
08:50:01 AM 137284 3526744 96.25 83296 817316 3192548 67.74
09:00:02 AM 28812 3635216 99.21 62000 723488 3599616 76.38
09:10:01 AM 42524 3621504 98.84 28976 601588 3792068 80.47
09:20:01 AM 71276 3592752 98.05 25720 583384 3782844 80.27
09:30:01 AM 81648 3582380 97.77 22472 573408 3784820 80.31
09:40:01 AM 87440 3576588 97.61 21816 573048 3784832 80.31
09:50:01 AM 80876 3583152 97.79 21860 572996 3785180 80.32
10:00:02 AM 88716 3575312 97.58 22032 569412 3783548 80.29
10:10:02 AM 90332 3573696 97.53 22312 569088 3779908 80.21
10:10:02 AM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit
10:20:01 AM 88780 3575248 97.58 22612 567108 3783600 80.29
10:30:01 AM 90904 3573124 97.52 22932 566772 3780868 80.23
Average: 168071 3495957 95.41 129184 898526 2965883 62.94
更新:非常感谢大家对此的评论和帮助。我在这里添加了更多背景信息:
我对 apache 进程的大小(以及服务器数量)存有疑问。进程大小过大是否表示存在问题?当我将服务器数量减少到 8 台时,apache 进程的大小在重启后立即变为 (200Mb-400Mb)。当我增加服务器数量时,大小会大幅减少到 (60mB) 左右,但随着时间的推移,它们的大小会增加,如上面的顶部输出所示。因此,我对服务器数量有点不确定 - 似乎 apache 在服务器数量较少时只是抢占可用内存 - 这是对此的合理解释吗?
我们正在一些虚拟主机上运行 apc,特别是服务器上的 2 个 magento 安装。
我关闭了 KeepAlive,看看这是否会影响不断增加的进程大小,似乎没有效果,但我在尝试解决这个问题以将其从方程式中消除时将其关闭。我们还尝试使用较低的 MaxRequestsPerChild 值 200,以防出现问题。
服务器有 4G 内存,但是我无法确定平均进程大小到底是多少(因为根据 apache 的设置不同而变化),我采用了这种方法,从低开始然后增加 apprach 并查看 free -m 中的可用内存(查看缓冲区/缓存线)
感谢您提供的意见。
答案1
sar -u
和列表之间似乎存在不一致top
。未列出的某些内容占用了大量 CPU。尝试将 top 的排序顺序更改为 %CPU,以查看 CPU 的去向。
看起来您在 Apache 下运行的应用程序中存在严重的内存泄漏。尝试将 MaxRequestsPerChild 减少到 200 或 100。这应该会导致服务器在泄漏过多内存之前被回收。
将 MaxSpareServers 减少到 10 左右可能会释放更多内存。
我使用修改后的日志格式来显示请求的执行时间。您可以使用执行时间字段来确定请求是否需要太长时间才能得到服务。这是我在同一个日志文件中为具有多个虚拟服务器的主机使用的日志格式。该%(ms)T
值替换了,除非启用了 IdentityCheck,否则%l
它始终为-
。(IdentityCheck 依赖于ident
在远程服务器上启用,这极不可能。)
# Modified log format with virtual host, execution time, and query params
LogFormat "%v:%p %a %{ms}T %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" local