Назад | Перейти на главную страницу

Сервер 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

Я обычно сортирую по памяти ("M" вверху), чтобы устранить подобные проблемы - это показывает объем реальной памяти, которую использует каждый процесс (и достаточно часто касаясь ее, чтобы не допустить ее в наименее недавно использовавшуюся очередь для меняются местами).

VIRT = RES + SWAP

Еще нужно проверить, является ли / tmp файловой системой tmpfs и записывает ли что-то в нее много данных.

На самом деле меня немного смущает то, что я вижу. Это sar вывод за интервал, когда произошел сбой, или просто вывод по умолчанию? И top вывод из совсем другого времени, 14:32?

Кроме того, в то время, когда вы собирали эту статистику, он на самом деле не использует своп, потому что в нем нет необходимости - почти 3G вашей памяти в настоящее время используется как дисковый кеш («kbcached»), а у вас есть только kbmemused - kbcached + kbbuffers = 664072KiB (648MiB) [в 04:40:01] используется реальными процессами.

Поскольку ни один образ процесса сам по себе не использует много памяти, но все же запускается oom-killer, я предполагаю, что что-то начало выполнять много операций ввода-вывода файлов и начало загрязнять страницы быстрее, чем можно было бы записать на диск. Я не совсем уверен, что это должно вызвать убийцу умов.

Ни одна из этих грязных страниц не пойдет на свопинг, потому что записать содержимое самого файла примерно так же просто, как записать данные для обмена.

Очевидное предположение состоит в том, что mysqld делал это, хотя я подозреваю, что он будет открывать свои файлы с помощью O_DIRECT, который предлагает ядру минимизировать влияние на кеш (при условии, что сервер БД выполняет собственное кэширование).

Обновить

На основе вашего free вывод из обновления №2, ответ на вопрос в вашей теме состоит в том, что он отлично использует своп; что-то просто все это использовало. Остальные предоставленные вами данные являются нормальными для системы, которая недавно загружалась.

Обновление 2

Я упомянул mysql ниже, но, честно говоря, я был бы удивлен, если бы это был виноват. Я бы заподозрил, что это спам, процессы CPanel или веб-приложения, работающие в первую очередь в Apache.

Я также предполагал, что вы используете достаточно актуальный дистрибутив без какой-либо настройки системных настроек и что у вас есть текущие исправления безопасности. В последние несколько месяцев был эксплойт BIND, который привел к DoS, но я не могу вспомнить, вызвал ли эксплойт исчерпание памяти или что-то еще. Я также недавно читал об эксплойтах CPanel, но не знаю, насколько они актуальны.