最近我的服务器出现了严重的内存问题。就在前几天,我的服务器完全没有响应,oom-killer 开始随机终止服务(httpd、php 等)。我甚至无法通过 SSH 进入我的服务器,但我可以 PING 它。
我确实查看了内核消息日志,但没有任何明确迹象表明是什么导致了内存问题 - 我所能看到的只是所有的 oom-killer 消息。
sar -r
命令:
03/15/2012
12:00:01 AM kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad
12:10:01 AM 2881812 582380 16.81 26652 250192 4192944 0 0.00 0
12:20:01 AM 2883600 580592 16.76 27104 250196 4192944 0 0.00 0
12:30:01 AM 2878576 585616 16.90 27656 250320 4192944 0 0.00 0
12:40:01 AM 2851856 612336 17.68 28312 271540 4192944 0 0.00 0
12:50:01 AM 2843560 620632 17.92 28968 274468 4192944 0 0.00 0
01:00:01 AM 2843892 620300 17.91 29440 274644 4192944 0 0.00 0
01:10:01 AM 22868 3441324 99.34 60764 2947884 4192936 8 0.00 8
01:20:01 AM 13836 3450356 99.60 62064 2882544 4192844 100 0.00 92
01:30:03 AM 14024 3450168 99.60 7820 3040976 4192844 100 0.00 0
01:40:01 AM 18600 3445592 99.46 18720 3039152 4192844 100 0.00 0
01:50:01 AM 25352 3438840 99.27 20048 3034584 4192844 100 0.00 0
02:00:01 AM 22572 3441620 99.35 20872 3036896 4192844 100 0.00 0
02:10:01 AM 21408 3442784 99.38 21776 3038236 4192844 100 0.00 0
02:20:01 AM 23240 3440952 99.33 23168 3032372 4192844 100 0.00 0
02:30:01 AM 72392 3391800 97.91 25100 2981488 4192844 100 0.00 0
02:40:01 AM 70876 3393316 97.95 25824 2981756 4192844 100 0.00 0
02:50:01 AM 74200 3389992 97.86 26464 2981860 4192844 100 0.00 0
03:00:01 AM 64980 3399212 98.12 32616 2982240 4192844 100 0.00 0
03:10:01 AM 63704 3400488 98.16 33564 2984268 4192844 100 0.00 0
03:20:01 AM 59564 3404628 98.28 34592 2988936 4192844 100 0.00 0
03:30:01 AM 53972 3410220 98.44 35740 2992484 4192844 100 0.00 0
03:40:01 AM 89120 3375072 97.43 36472 2956088 4192844 100 0.00 0
03:50:01 AM 88788 3375404 97.44 36920 2956324 4192844 100 0.00 0
04:00:01 AM 78540 3385652 97.73 37740 2964452 4192844 100 0.00 0
04:10:01 AM 21720 3442472 99.37 106636 2892836 4192844 100 0.00 0
04:20:01 AM 22796 3441396 99.34 107172 2890796 4192844 100 0.00 0
04:30:01 AM 30604 3433588 99.12 107812 2884644 4192844 100 0.00 0
04:40:01 AM 32744 3431448 99.05 108568 2875944 4192844 100 0.00 0
以下是top
按交换大小排序的:
top - 14:32:01 up 15:37, 1 user, load average: 0.10, 0.10, 0.04
Tasks: 110 total, 3 running, 107 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.5%us, 0.3%sy, 0.0%ni, 98.4%id, 0.7%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 3464192k total, 2663384k used, 800808k free, 140796k buffers
Swap: 4192944k total, 100k used, 4192844k free, 2073748k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ SWAP COMMAND
1975 mysql 15 0 222m 43m 4652 S 0.0 1.3 0:11.82 178m mysqld
1859 named 22 0 161m 5228 1948 S 0.0 0.2 0:00.04 156m named
2144 root 18 0 143m 47m 1072 S 0.0 1.4 0:00.00 95m spamd
2119 root 15 0 143m 49m 2628 S 0.0 1.5 0:01.17 94m spamd
2161 root 15 0 93372 1280 936 S 0.0 0.0 0:00.01 89m pure-ftpd
2163 root 18 0 91016 976 804 S 0.0 0.0 0:00.01 87m pure-authd
20035 root 15 0 91800 3096 2408 S 0.0 0.1 0:00.00 86m sshd
19432 root 15 0 92232 3656 2900 R 0.0 0.1 0:00.00 86m sshd
2377 root 19 0 93268 14m 1940 S 0.0 0.4 0:00.00 76m cpdavd
2380 root 15 0 87824 11m 1520 S 0.0 0.3 0:00.07 74m cpsrvd-ssl
3115 root 15 0 74832 1168 584 S 0.0 0.0 0:00.05 71m crond
18548 root 18 0 73624 3036 236 S 0.0 0.1 0:00.00 68m httpd
19713 nobody 18 0 73760 4460 1584 S 0.0 0.1 0:00.00 67m httpd
19712 nobody 15 0 73760 4484 1584 S 0.0 0.1 0:00.00 67m httpd
19709 nobody 18 0 73624 4460 1584 S 0.0 0.1 0:00.00 67m httpd
19508 nobody 15 0 73760 4600 1680 S 0.0 0.1 0:00.00 67m httpd
19162 nobody 15 0 73756 4640 1708 S 0.0 0.1 0:00.01 67m httpd
19154 nobody 15 0 73756 4656 1728 S 0.0 0.1 0:00.00 67m httpd
19157 nobody 15 0 73756 4696 1740 S 0.0 0.1 0:00.01 67m httpd
19327 nobody 15 0 73756 4700 1740 S 0.0 0.1 0:00.01 67m httpd
19163 nobody 15 0 73756 4768 1836 S 0.0 0.1 0:00.00 67m httpd
19164 nobody 15 0 73756 4788 1856 S 0.0 0.1 0:00.00 67m httpd
2145 root 18 0 73624 5740 2940 S 0.0 0.2 0:00.60 66m httpd
1911 root 20 0 65952 1276 1044 S 0.0 0.0 0:00.01 63m mysqld_safe
出于某种原因,它说它只使用了 100k SWAP,但这没有任何意义。VIRT
每个进程使用的 SWAP 数量不就是这样吗?
* 更新 *
以下是有关文件系统的更多信息:
# df -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/md2 ext3 468924192 17215692 427504176 4% /
/dev/md1 ext3 2030672 58788 1867068 4% /tmp
/dev/md0 ext3 101018 13414 82388 15% /boot
tmpfs tmpfs 1732096 0 1732096 0% /dev/shm
* 更新 2 *
这是free -m
我昨天在服务器处于 OOM 状态时设法运行的:
total used free shared buffers cached
Mem: 3383 3372 10 0 0 6
-/+ buffers/cache: 3365 17
Swap: 4094 4094 0
答案1
我通常按内存(顶部为“M”)排序以排除这类故障 - 它向您显示了每个进程正在使用的实际内存量(并且频繁接触以使其远离最近最少使用的交换队列)。
VIRT = RES + SWAP
另一件需要检查的事情是 /tmp 是否是 tmpfs 文件系统,以及是否有东西在那里写入大量数据。
我其实对所看到的内容有点困惑。这个sar
输出是发生中断时的时间间隔还是默认输出?而且top
输出来自完全不同的时间,14:32?
另外,当您获取这些统计数据时,它实际上并没有使用交换,因为它不需要 - 您的内存中有近 3G 当前被用作磁盘缓存(“kbcached”),并且实际进程仅使用了 kbmemused - kbcached + kbbuffers = 664072KiB(648MiB)[在 04:40:01]。
因为没有进程映像本身占用太多内存,但 oom-killer 却启动了,所以我猜想有什么东西开始执行大量文件 I/O,并且开始以比写入磁盘更快的速度弄脏页面。不过我不太确定这是否应该触发 oom-killer。
这些脏页都不会进入交换区,因为将文件本身的内容写出与将数据写入交换区一样容易。
显而易见的猜测是 mysqld 正在这样做,尽管我怀疑它会使用 O_DIRECT 打开它的文件,这建议内核尽量减少对缓存的影响(前提是 DB 服务器正在执行自己的缓存)。
更新
根据您free
从更新 #2 中输出的信息,您主题中问题的答案是,它使用交换空间一切正常;只是某些东西用完了交换空间。您提供的其他数据对于最近启动的系统而言是正常的。
更新 2
我在下面提到了 mysql,但说实话,如果这是罪魁祸首,我会感到惊讶。我首先怀疑是 spamd、CPanel 进程或 Apache 中运行的 Web 应用程序。
我还假设您运行的是相当新的发行版,没有对系统可调参数进行任何调整,并且您安装了最新的安全补丁。过去几个月有一个 BIND 漏洞导致 DoS,但我记不清该漏洞是否触发了内存耗尽或其他问题。我最近也读过 CPanel 漏洞,但我不知道它们有多新。