我为我们的 (Debian) LAMP 集群设置的 Munin 通知一直在不断通知我,我们生产机器上的负载已经处于危险水平。虽然全年的平均负载通常在 2 到 8 之间,但过去一个月的负载,甚至在过去一个月内,已经飙升至 10、18,有时甚至达到 50-60。峰值每次仅持续 5-10 分钟,大约每 2-3 小时发生一次。峰值不会影响性能,因为我有一个脚本,当负载超过 10 时,它会将流量从我们的服务器发送到镜像 CDN。我寻找过与此时间范围相关的 cron 作业,但我看不到任何会导致这种情况的原因。网站流量也很正常(我们每天收到大约 20 万次访问)。此 Web 服务器依赖的 MySQL 数据库似乎运行正常。该服务器上的负载很低,性能良好。
我也试图回忆一下在这个问题出现时我做过什么改变,但我真的想不出任何事情。
这可能没什么可说的。也许上面的打印输出(下面)中有一些我没看到的线索。
我该如何继续寻找原因?
-- 当负载未达到峰值时的典型顶部:
top - 11:13:09 up 472 days, 25 min, 1 user, load average: 6.08, 4.29, 3.80
Tasks: 105 total, 1 running, 104 sleeping, 0 stopped, 0 zombie
Cpu(s): 41.2%us, 5.8%sy, 0.0%ni, 49.5%id, 2.7%wa, 0.1%hi, 0.7%si, 0.0%st
Mem: 3369592k total, 2166980k used, 1202612k free, 559504k buffers
Swap: 2650684k total, 1892k used, 2648792k free, 1129116k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
32046 apache 15 0 36300 12m 9828 S 20 0.4 0:01.97 apache2
32679 apache 15 0 36568 13m 10m S 19 0.4 0:01.69 apache2
31441 apache 15 0 36616 13m 10m S 19 0.4 0:04.13 apache2
31477 apache 15 0 36596 13m 9.8m S 15 0.4 0:01.99 apache2
31993 apache 15 0 36876 16m 12m S 12 0.5 0:02.01 apache2
31782 apache 15 0 36836 14m 10m S 8 0.4 0:02.17 apache2
32198 apache 15 0 36536 13m 10m S 7 0.4 0:01.59 apache2
880 apache 15 0 36508 9708 6236 S 7 0.3 0:00.42 apache2
31945 apache 17 0 36876 16m 13m S 5 0.5 0:03.17 apache2
32197 apache 16 0 36636 10m 7504 S 5 0.3 0:02.70 apache2
32326 apache 15 0 37024 11m 7632 S 5 0.3 0:02.15 apache2
32565 apache 15 0 37280 13m 9.8m S 5 0.4 0:03.75 apache2
32676 apache 15 0 36896 16m 12m S 4 0.5 0:00.95 apache2
32678 apache 15 0 36536 12m 9692 S 4 0.4 0:02.27 apache2
974 apache 16 0 37064 9888 6016 D 4 0.3 0:00.13 apache2
32150 apache 16 0 36832 13m 10m S 3 0.4 0:01.74 apache2
31780 apache 16 0 36848 11m 7660 S 3 0.3 0:02.87 apache2
以下是我们进行尖峰测试时的顶部:
top - 15:25:22 up 474 days, 4:37, 1 user, load average: 78.73, 50.20, 24.79
Tasks: 250 total, 4 running, 244 sleeping, 0 stopped, 2 zombie
Cpu(s): 36.5%us, 4.7%sy, 0.0%ni, 56.4%id, 2.0%wa, 0.1%hi, 0.3%si, 0.0%st
Mem: 3369592k total, 2099904k used, 1269688k free, 553840k buffers
Swap: 2650684k total, 5104k used, 2645580k free, 729252k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
27716 apache 15 0 43612 20m 9.8m S 20 0.6 0:01.95 apache2
16782 apache 16 0 39460 19m 13m R 19 0.6 0:04.61 apache2
19701 apache 15 0 39232 16m 10m S 17 0.5 0:03.18 apache2
19677 apache 16 0 39208 15m 9956 R 12 0.5 0:05.03 apache2
16760 apache 15 0 36620 16m 13m S 8 0.5 0:06.35 apache2
19798 apache 15 0 36564 13m 9988 S 6 0.4 0:02.76 apache2
20325 apache 15 0 36616 13m 9704 S 6 0.4 0:02.11 apache2
19699 apache 15 0 36860 15m 12m S 5 0.5 0:03.10 apache2
15109 apache 15 0 36624 16m 13m S 4 0.5 0:05.97 apache2
15101 apache 15 0 36592 13m 10m S 3 0.4 0:08.96 apache2
15112 apache 15 0 36612 16m 13m S 3 0.5 0:07.57 apache2
20204 apache 15 0 44612 21m 9.9m S 3 0.6 0:03.55 apache2
19624 apache 15 0 36588 13m 10m S 3 0.4 0:02.00 apache2
20151 apache 15 0 36616 16m 13m S 3 0.5 0:02.14 apache2
26252 apache 15 0 37072 13m 9m S 3 0.4 0:01.09 apache2
19805 apache 15 0 36472 16m 12m S 2 0.5 0:03.68 apache2
20163 apache 15 0 36640 13m 10m S 2 0.4 0:02.50 apache2
27260 apache 18 0 44292 20m 9328 S 2 0.6 0:02.08 apache2
29149 apache 15 0 36172 11m 8744 S 2 0.4 0:00.69 apache2
20315 apache 15 0 36360 15m 12m S 2 0.5 0:02.06 apache2
29148 apache 16 0 36184 8872 5644 S 2 0.3 0:00.08 apache2
答案1
实际上,Loadavg 并不能告诉您太多有关系统是否性能不佳的信息;它是一种非常通用的指标,用于描述系统的繁忙程度,其中繁忙定义为当前正在执行或等待执行 CPU 指令的进程数的索引。在八核系统上,工作负载由大量短命进程(例如 Web 服务器)描述,loadavg 超过 50 甚至可能不会引起我的注意。
您能否将这些峰值与您的 apache 日志关联起来,以查看在峰值期间响应时间是否受到影响?您是否只是在峰值期间处理更多请求?您是否保存了 iowait 和用户与系统 cpu 等统计数据,它们是否相关?另一位提到交换的发帖人是正确的:交换会导致进程堆积,因为内存访问速度减慢到磁盘速度,这会导致更高的 loadavg,因为进程会挂起。
这些都是需要调查的事情;更多数据和历史保存的数据可以帮助您解决这个问题。希望这能有所帮助;祝你好运!
答案2
据新上任的系统管理员称,负载之所以这么高,是因为我们最近一直在不断达到带宽分配的容量(不确定是入站还是出站)。这个问题的一些回答者说得对,这根本不是服务器故障的迹象。这是一个网络问题,新请求必须等待带宽清除后才能继续 - 因此,负载(延迟)很高。无论如何,我们最近搬到了一个带宽分配更大的新数据中心。谢谢大家!
答案3
您在后端使用 Memcached 之类的东西吗?TTL 会在那个时间范围内过期吗?
当负载超过 100% 时,性能是否真的会受到影响?在多核 CPU 中,这很可能是正常的。
PS,看起来你正在动用你的 SWAP 分配;我会看一下。
答案4
如果您的 Apache 应用程序针对数据库后端运行,则很有可能在数据库端遇到锁定/争用问题。您频繁生成(或重复使用)的 Apache 进程会发现自己正在等待长时间运行的数据库请求完成,因此累积到一个很大的数字。
因此,请检查您的数据库服务器是否能反映负载情况。如果您碰巧使用 MySQL(LAMP 中的 M 是吗?),则应考虑使用mysql-snmp以获得更详细的报告。