Убийца OOM, кажется, убивает, несмотря на то, что в моей системе более чем достаточно свободной оперативной памяти:
Через 27 минут и 408 процессов система снова начала отвечать. Я перезагрузил его примерно через час, и вскоре после этого использование памяти вернулось в норму (для этой машины).
При осмотре у меня на компьютере запущено несколько интересных процессов:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
[...snip...]
root 1399 60702042 0.2 482288 1868 ? Sl Feb21 21114574:24 /sbin/rsyslogd -i /var/run/syslogd.pid -c 4
[...snip...]
mysql 2022 60730428 5.1 1606028 38760 ? Sl Feb21 21096396:49 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
[...snip...]
Этот конкретный сервер работает ок. 8 часов, и это единственные два процесса, которые имеют такие ... нечетные значения. Я подозреваю, что происходит «что-то еще», потенциально имеющее отношение к этим бессмысленным ценностям. В частности, я считаю, что система думает что это не в памяти, хотя на самом деле это не так. В конце концов, он думает, что rsyslogd постоянно использует 55383984% ЦП, хотя теоретический максимум в этой системе в любом случае составляет 400%.
Это полностью обновленная версия CentOS 6 (6.2) с 768 МБ ОЗУ. Будем признательны за любые предложения о том, как выяснить, почему это происходит!
редактировать: прикрепление vm. sysctl tunables .. Я играл с swappiness (это видно из 100), и я также использую абсолютно ужасный скрипт, который выгружает мои буферы и кеш (видно, что vm.drop_caches равно 3) + синхронизирует диск каждые 15 минут. Вот почему после перезагрузки кэшированные данные выросли до несколько нормального размера, но затем снова быстро исчезли. Я понимаю, что наличие кеша - это очень хорошо, но пока я не разберусь с этим ...
Также несколько интересно то, что хотя мой файл подкачки увеличивался во время мероприятия, он достиг только ~ 20% от общего возможного использования, что нехарактерно для истинных событий OOM. С другой стороны, за тот же период диск полностью отключился, что характерно для OOM-события, когда файл подкачки находится в игре.
sysctl -a 2>/dev/null | grep '^vm'
:
vm.overcommit_memory = 1
vm.panic_on_oom = 0
vm.oom_kill_allocating_task = 0
vm.extfrag_threshold = 500
vm.oom_dump_tasks = 0
vm.would_have_oomkilled = 0
vm.overcommit_ratio = 50
vm.page-cluster = 3
vm.dirty_background_ratio = 10
vm.dirty_background_bytes = 0
vm.dirty_ratio = 20
vm.dirty_bytes = 0
vm.dirty_writeback_centisecs = 500
vm.dirty_expire_centisecs = 3000
vm.nr_pdflush_threads = 0
vm.swappiness = 100
vm.nr_hugepages = 0
vm.hugetlb_shm_group = 0
vm.hugepages_treat_as_movable = 0
vm.nr_overcommit_hugepages = 0
vm.lowmem_reserve_ratio = 256 256 32
vm.drop_caches = 3
vm.min_free_kbytes = 3518
vm.percpu_pagelist_fraction = 0
vm.max_map_count = 65530
vm.laptop_mode = 0
vm.block_dump = 0
vm.vfs_cache_pressure = 100
vm.legacy_va_layout = 0
vm.zone_reclaim_mode = 0
vm.min_unmapped_ratio = 1
vm.min_slab_ratio = 5
vm.stat_interval = 1
vm.mmap_min_addr = 4096
vm.numa_zonelist_order = default
vm.scan_unevictable_pages = 0
vm.memory_failure_early_kill = 0
vm.memory_failure_recovery = 1
edit: и прикрепление первого сообщения OOM ... при ближайшем рассмотрении, он говорит, что что-то явно пошло изо всех сил, чтобы съесть все мое пространство подкачки.
Feb 21 17:12:49 host kernel: mysqld invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0
Feb 21 17:12:51 host kernel: mysqld cpuset=/ mems_allowed=0
Feb 21 17:12:51 host kernel: Pid: 2777, comm: mysqld Not tainted 2.6.32-71.29.1.el6.x86_64 #1
Feb 21 17:12:51 host kernel: Call Trace:
Feb 21 17:12:51 host kernel: [<ffffffff810c2e01>] ? cpuset_print_task_mems_allowed+0x91/0xb0
Feb 21 17:12:51 host kernel: [<ffffffff8110f1bb>] oom_kill_process+0xcb/0x2e0
Feb 21 17:12:51 host kernel: [<ffffffff8110f780>] ? select_bad_process+0xd0/0x110
Feb 21 17:12:51 host kernel: [<ffffffff8110f818>] __out_of_memory+0x58/0xc0
Feb 21 17:12:51 host kernel: [<ffffffff8110fa19>] out_of_memory+0x199/0x210
Feb 21 17:12:51 host kernel: [<ffffffff8111ebe2>] __alloc_pages_nodemask+0x832/0x850
Feb 21 17:12:51 host kernel: [<ffffffff81150cba>] alloc_pages_current+0x9a/0x100
Feb 21 17:12:51 host kernel: [<ffffffff8110c617>] __page_cache_alloc+0x87/0x90
Feb 21 17:12:51 host kernel: [<ffffffff8112136b>] __do_page_cache_readahead+0xdb/0x210
Feb 21 17:12:51 host kernel: [<ffffffff811214c1>] ra_submit+0x21/0x30
Feb 21 17:12:51 host kernel: [<ffffffff8110e1c1>] filemap_fault+0x4b1/0x510
Feb 21 17:12:51 host kernel: [<ffffffff81135604>] __do_fault+0x54/0x500
Feb 21 17:12:51 host kernel: [<ffffffff81135ba7>] handle_pte_fault+0xf7/0xad0
Feb 21 17:12:51 host kernel: [<ffffffff8103cd18>] ? pvclock_clocksource_read+0x58/0xd0
Feb 21 17:12:51 host kernel: [<ffffffff8100f951>] ? xen_clocksource_read+0x21/0x30
Feb 21 17:12:51 host kernel: [<ffffffff8100fa39>] ? xen_clocksource_get_cycles+0x9/0x10
Feb 21 17:12:51 host kernel: [<ffffffff8100c949>] ? __raw_callee_save_xen_pmd_val+0x11/0x1e
Feb 21 17:12:51 host kernel: [<ffffffff8113676d>] handle_mm_fault+0x1ed/0x2b0
Feb 21 17:12:51 host kernel: [<ffffffff814ce503>] do_page_fault+0x123/0x3a0
Feb 21 17:12:51 host kernel: [<ffffffff814cbf75>] page_fault+0x25/0x30
Feb 21 17:12:51 host kernel: Mem-Info:
Feb 21 17:12:51 host kernel: Node 0 DMA per-cpu:
Feb 21 17:12:51 host kernel: CPU 0: hi: 0, btch: 1 usd: 0
Feb 21 17:12:51 host kernel: CPU 1: hi: 0, btch: 1 usd: 0
Feb 21 17:12:51 host kernel: CPU 2: hi: 0, btch: 1 usd: 0
Feb 21 17:12:51 host kernel: CPU 3: hi: 0, btch: 1 usd: 0
Feb 21 17:12:51 host kernel: Node 0 DMA32 per-cpu:
Feb 21 17:12:51 host kernel: CPU 0: hi: 186, btch: 31 usd: 47
Feb 21 17:12:51 host kernel: CPU 1: hi: 186, btch: 31 usd: 0
Feb 21 17:12:51 host kernel: CPU 2: hi: 186, btch: 31 usd: 0
Feb 21 17:12:51 host kernel: CPU 3: hi: 186, btch: 31 usd: 174
Feb 21 17:12:51 host kernel: active_anon:74201 inactive_anon:74249 isolated_anon:0
Feb 21 17:12:51 host kernel: active_file:120 inactive_file:276 isolated_file:0
Feb 21 17:12:51 host kernel: unevictable:0 dirty:0 writeback:2 unstable:0
Feb 21 17:12:51 host kernel: free:1600 slab_reclaimable:2713 slab_unreclaimable:19139
Feb 21 17:12:51 host kernel: mapped:177 shmem:84 pagetables:12939 bounce:0
Feb 21 17:12:51 host kernel: Node 0 DMA free:3024kB min:64kB low:80kB high:96kB active_anon:5384kB inactive_anon:5460kB active_file:36kB inactive_file:12kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:14368kB mlocked:0kB dirty:0kB writeback:0kB mapped:16kB shmem:0kB slab_reclaimable:16kB slab_unreclaimable:116kB kernel_stack:32kB pagetables:140kB unstable:0kB bounce:0kB writeback_tmp:0kB pages_scanned:8 all_unreclaimable? no
Feb 21 17:12:51 host kernel: lowmem_reserve[]: 0 741 741 741
Feb 21 17:12:51 host kernel: Node 0 DMA32 free:3376kB min:3448kB low:4308kB high:5172kB active_anon:291420kB inactive_anon:291536kB active_file:444kB inactive_file:1092kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:759520kB mlocked:0kB dirty:0kB writeback:8kB mapped:692kB shmem:336kB slab_reclaimable:10836kB slab_unreclaimable:76440kB kernel_stack:2520kB pagetables:51616kB unstable:0kB bounce:0kB writeback_tmp:0kB pages_scanned:2560 all_unreclaimable? yes
Feb 21 17:12:51 host kernel: lowmem_reserve[]: 0 0 0 0
Feb 21 17:12:51 host kernel: Node 0 DMA: 5*4kB 4*8kB 2*16kB 0*32kB 0*64kB 1*128kB 1*256kB 1*512kB 0*1024kB 1*2048kB 0*4096kB = 3028kB
Feb 21 17:12:51 host kernel: Node 0 DMA32: 191*4kB 63*8kB 9*16kB 2*32kB 0*64kB 1*128kB 1*256kB 1*512kB 1*1024kB 0*2048kB 0*4096kB = 3396kB
Feb 21 17:12:51 host kernel: 4685 total pagecache pages
Feb 21 17:12:51 host kernel: 4131 pages in swap cache
Feb 21 17:12:51 host kernel: Swap cache stats: add 166650, delete 162519, find 1524867/1527901
Feb 21 17:12:51 host kernel: Free swap = 0kB
Feb 21 17:12:51 host kernel: Total swap = 523256kB
Feb 21 17:12:51 host kernel: 196607 pages RAM
Feb 21 17:12:51 host kernel: 6737 pages reserved
Feb 21 17:12:51 host kernel: 33612 pages shared
Feb 21 17:12:51 host kernel: 180803 pages non-shared
Feb 21 17:12:51 host kernel: Out of memory: kill process 2053 (mysqld_safe) score 891049 or a child
Feb 21 17:12:51 host kernel: Killed process 2266 (mysqld) vsz:1540232kB, anon-rss:4692kB, file-rss:128kB
Я только что посмотрел на дамп журнала oom и сомневаюсь в точности этого графика. Обратите внимание на первую строку «Node 0 DMA32». Это говорит free:3376kB
, min:3448kB
, и low:4308kB
. Каждый раз, когда свободное значение падает ниже нижнего значения, предполагается, что kswapd начнет менять местами, пока это значение не вернется выше верхнего значения. Всякий раз, когда free падает ниже min, система в основном зависает, пока ядро не вернет его выше минимального значения. Это сообщение также указывает на то, что своп был полностью использован там, где говорится Free swap = 0kB
.
Таким образом, в основном kswapd сработал, но своп был заполнен, поэтому он ничего не мог сделать, а значение pages_free все еще было ниже значения pages_min, поэтому единственным вариантом было начать убивать вещи, пока он не сможет получить резервную копию pages_free.
У тебя определенно закончилась память.
http://web.archive.org/web/20080419012851/http://people.redhat.com/dduval/kernel/min_free_kbytes.html есть действительно хорошее объяснение того, как это работает. См. Раздел «Реализация» внизу.
Избавьтесь от скрипта drop_caches. Кроме того, вы должны публиковать соответствующие части вашего dmesg
и /var/log/messages
вывод, показывающий сообщения OOM.
Однако, чтобы остановить такое поведение, я бы рекомендовал попробовать это sysctl
настраиваемый. Это система RHEL / CentOS 6, которая явно работает с ограниченными ресурсами. Это виртуальная машина?
Попробуйте изменить /proc/sys/vm/nr_hugepages
и посмотрите, сохранятся ли проблемы. Это может быть проблема фрагментации памяти, но посмотрите, имеет ли значение этот параметр. Чтобы сделать изменение постоянным, добавьте vm.nr_hugepages = value
на ваш /etc/sysctl.conf
и беги sysctl -p
перечитать файл конфигурации ...
Также см: Интерпретация загадочных сообщений ядра "сбой выделения страницы"
На графике нет данных с момента запуска убийцы OOM до его завершения. Я считаю, что во временном интервале, когда график прерывается, на самом деле потребление памяти резко возрастает, и памяти больше нет. В противном случае убийца OOM не использовался бы. Если вы посмотрите график свободной памяти после остановки OOM killer, вы увидите, что он падает с более высокого значения, чем раньше. По крайней мере, он справился со своей задачей, освободив память.
Обратите внимание, что ваше пространство подкачки почти полностью используется до перезагрузки. Это почти никогда не бывает хорошо и верный признак того, что свободной памяти осталось мало.
Причина отсутствия данных за этот конкретный период времени в том, что система слишком занята другими делами. «Смешные» значения в вашем списке процессов могут быть просто результатом, а не причиной. Это не что-то неслыханное.
Проверьте /var/log/kern.log и / var / log / messages, какую информацию вы там найдете?
Если ведение журнала также прекратилось, попробуйте другие действия, сбросьте список процессов в файл примерно каждую секунду или около того, то же самое с информацией о производительности системы. Запустите его с высоким приоритетом, чтобы он мог выполнять свою работу (надеюсь), когда нагрузка резко возрастает. Хотя, если у вас нет ядра с вытеснением (иногда обозначаемого как «серверное»), вам может не повезти в этом отношении.
Я думаю, вы обнаружите, что процесс (а), который (-ы) использует (-ы) наибольшее количество ЦП в то время, когда возникают ваши проблемы, является (является) причиной. Я никогда не видел, чтобы rsyslogd и mysql вели себя подобным образом. Более вероятными виновниками являются Java-приложения и приложения с графическим интерфейсом пользователя, такие как браузер.