Centos 服务器未正确使用 SWAP 并出现 OOM

Centos 服务器未正确使用 SWAP 并出现 OOM

最近我的服务器出现了严重的内存问题。就在前几天,我的服务器完全没有响应,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 漏洞,但我不知道它们有多新。

相关内容