Вбивця OOM вбиває речі з великою кількістю (?) Вільної оперативної пам’яті


11

Вбивця OOM, здається, вбиває речі, незважаючи на те, що в моїй системі більше ніж достатньо оперативної пам’яті:

Графік використання пам'яті (Повна роздільна здатність)

Графік використання IO (Повна роздільна здатність)

Через 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 Мб оперативної пам’яті. Будемо вдячні будь-які пропозиції щодо того, як зрозуміти, чому це відбувається!

edit: приєднання vm. Налаштування sysctl .. Я граю із свопістю (це стає очевидним, коли це 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

Чи можете ви надати результат sysctl -a 2>/dev/null | grep '^vm'?
Патрік

Додано. Сподіваємось, ви (або хтось) зможете знайти щось, що я пропустив.
Кайл Брентлі

Єдине, що вискакує на мене - це overcommit_memoryналаштування. Якщо встановити його на 1, це не повинно викликати подібну поведінку, але я ніколи не мав потреби встановлювати його на "завжди перевиконати" раніше, тому не так багато досвіду. Переглядаючи інші додані вами нотатки, ви сказали, що своп використовували лише 20%. Однак , на думку журналу відвалу OOM, Free swap = 0kB. Це, безумовно, думав, що своп використовується на 100%.
Патріку

Відповіді:


13

Я просто переглянув дамп журналу oom і сумніваюся в точності цього графіка. Помітьте перший рядок "Вузол 0 DMA32". Він каже free:3376kB, min:3448kBі low:4308kB. Щоразу, коли вільне значення опускається нижче низького значення, kswapd повинен починати міняти речі, поки це значення не повернеться вище високого значення. Кожного разу, коли вільні краплі нижче мінімуму, система в основному зависає, поки ядро ​​не поверне її вище мінімального значення. Це повідомлення також вказує на те, що своп повністю використовувався там, де він пише Free swap = 0kB.
Таким чином, в основному спрацьовує kswapd, але своп був повним, тому він нічого не міг зробити, а значення pages_free все ще було нижче значення pages_min, тому єдиним варіантом було почати вбивати речі, поки не вдасться створити резервну копію сторінки_free.
У вас точно не вистачало пам’яті.

http://web.archive.org/web/20080419012851/http://people.redhat.com/dduval/kernel/min_free_kbytes.html справді добре пояснює, як це працює. Дивіться розділ "Впровадження" внизу.


1
Тож ОП дійсно просто потребує більше оперативної пам’яті…
ewwhite

більше барана, або дізнайся, що його їсть.
Патрік

Я дуже точно розміщую рядки на цьому графіку. Він припинив реєстрацію даних ~ 1-2 м до вбиття першого процесу, і відновив дані журналу ~ 4-5 м після вбиття останнього. На цей момент я маю на обмірі, що якийсь процес пройшов абсолютно не так, і я почав обміняти файл моєї сторінки - як тільки він нарешті все отримав, він також знищив процеси, які функціонально закінчуються з файлу сторінок, і саме тому, коли дані повертаються, файл сторінки підвищений, але не повний. Пропозиції щодо того, як визначити, що це робить, будуть вітатися!
Kyle Brantley

@KyleBrantley Які значення ви тягнете для створення графіка? Одним із недоліків системи віртуальної пам’яті linux є те, що немає конкретного визначення поняття «безкоштовно». Існує десяток способів визначення "вільної пам'яті". Значення, яке стосується kswapd, - це значення сторінки_free. Щодо безкоштовного свопу, я не знаю, яке значення ви могли б прочитати, яке було б так далеко. Єдиний спосіб реально побачити, що їсть пам'ять, - це записувати постійні знімки всіх процесів у коробці та бачити, що використовує всю пам'ять, коли вбивця оома починає збиватися.
Патрік

2
Так, мені не вистачило пам’яті. Я завершив простукування через колоди, виявивши, що в моїх апаш-процесах дітей неодноразово вбивали, через що я зрозумів, що у мене функціонально нескінченні дитячі процеси, які можуть початися. Все, що потрібно, - це автоматизовані боти спам-блогу, які викидали багато запитів / секунди на хост, щоб він перейшов. Налаштування апачі все вирішило.
Кайл Брентлі

3

Позбавтеся від сценарію 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. Хоча MySQL - це найінтенсивніша оперативна пам'ять, яку я працюю, я налаштував її так, щоб не перевантажувати поле, тому окрім шалених значень, які я бачу вгорі, я не дуже підозрюю про це (5,1% використання пам'яті добре, все, що враховується). Це VPS з 768 Мб оперативної пам’яті. Я прочитаю на nr_hugepages і дам йому знімати, дякую!
Kyle Brantley

@ewwhite виділяючи, що багато величезних сторінок вбили б ящик. У коробці є тільки 768 Мб, а за замовчуванням величезна сторінка 2 Мб, що може виділити 2 ГБ величезних сторінок. Ящик не міг би впоратися з цим і негайно помер.
Патрік

Оновлено. Однак значення слід збільшувати з нуля.
ewwhite

Це все ще складніше, ніж це. Ви повинні встановити величезні дозволи на сторінку, і mysql повинен бути налаштований на використання величезних сторінок, інакше ви просто розподіляєте їх без причини.
Патрік

2

На графіку немає даних про те, коли вбивця OOM починається до кінця. Я вірю в часові рамки, коли графік переривається, що насправді споживання пам’яті зростає, а пам’яті вже немає. Інакше вбивця OOM не використовувався. Якщо ви переглядаєте графік вільної пам'яті після зупинки вбивці OOM, ви можете бачити, що він знижується з більш високого значення, ніж раніше. Принаймні, він зробив свою роботу належним чином, звільнивши пам’ять.

Зауважте, що ваш обмінний простір майже повністю використовується до перезавантаження. Це майже ніколи не є доброю справою, і впевнений знак, що вільної пам’яті мало.

Причина відсутності даних для конкретного часового періоду полягає в тому, що система занадто зайнята іншими справами. "Смішні" значення у вашому списку процесів можуть бути просто результатом, а не причиною. Це не нечувано.

Перевірте /var/log/kern.log та / var / log / messages, яку інформацію ви можете знайти там?

Якщо журнал також припинився, то спробуйте інші речі, скидайте список процесів у файл щосекунди або близько того, що відповідає інформації про продуктивність системи. Запускайте його з високим пріоритетом, щоб він все-таки міг виконувати свою роботу (сподіваємось), коли навантаження спаде. Хоча, якщо у вас немає ядра попередження, яка (іноді позначається як "серверне" ядро), вам може не пощастити в цьому плані.

Я думаю, ви побачите, що процес (и), що використовують (використовуються) найбільшу кількість процесорних процесів протягом часу, коли починаються ваші проблеми, є причиною. Я ніколи не бачив rsyslogd, ні mysql, що поводиться так. Більш вірогідними винуватцями є додатки java та програми, керовані gui, наприклад браузер.


Немає даних про цей проміжок, оскільки навантаження на коробку настільки абсурдно висока, що все, включаючи моніторинговий агент, перемелюється до повного припинення. Сам агент ніколи фактично не був убитий у період майже смерті, але він також не міг повідомити про будь-які дані. Мій обмінний простір насправді був чудовим. Перед перезавантаженням було використано ~ 130/512 Мб. rsyslogd налаштований повідомляти журнали в мережеве розташування, де все, що траплялося, реєструвалося - і окрім цього вбивалося 408 процесів (деякі з яких були апашеними дітьми, які були перезапущені), нічого не виділялося.
Кайл Брентлі

Я можу закінчити скидання повного списку процесів у файл (або мережу) кожні кілька секунд, якщо я не можу насправді зрозуміти, що тут відбувається, тому дякую за гарну ідею.
Кайл Брентлі

Так, ви повинні це зробити, переконайтесь, що ви також записуєте використання процесора кожного процесу, подивіться на "top -b" (пакетний режим). Винуватцем може стати процес, який спричиняє шипи.
асек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.