LINUX.ORG.RU
ФорумAdmin

странная проблема с памятью out of memory

 ,


1

2

Добрый день нужен совет.

Есть приложение go - которое падает fatal error: runtime: out of memory

Смотрю в это время top:

KiB Mem : 65401672 total,  1018996 free, 43470864 used, 20911812 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 27394280 avail Mem

Swap выключен потому что это k8s нода.

На этом сервере уже запущено 5-ть экземпляров этого приложения, запускается 6-ое. Оно достаточно быстро начинает съедать free память, но все настолько быстро что падает за 1-2 секунды, насколько я успеваю увидеть оно съедает память из free но buff/cache не трогается.

При этом я вижу что другие приложения на ноде например apt install atop падает с:

FATAL -> Failed to fork. 0%

Как-то можно что-то с этим сделать? С одной стороны вроде 20GB в кеше, но с другой стороны видимо он не успевает вытеснятся.

update 1:

Ситуация еще более странная, я почистил файловый кеш во free - 18GB, перезапускаю приложение, в топе успеваю увидеть что оно съедает 700MB и падает out of memory

Соседние точно такие-же приложения (копии) висят с потреблением памяти - 5-6GB

update 2:

При этом именно на этих нодах где падает приложение есть в логах ошибка

[Sat Nov  9 10:21:24 2019] request_module: kmod_concurrent_max (0) close to 0 (max_modprobes: 50), for module net-pf-10, throttling...

Но время падения и время сообщений не совпадает, ipv6 выключен в grub

★★

Последнее исправление: tugrik (всего исправлений: 2)

Логи ядра надо смотреть. Если превышены лимиты ulimits для пользователя под которым запускается программа то ядро Linux ее убивает, в журнале о сем создается запись.

anonymous
()
Ответ на: комментарий от anonymous

Ну вот ulimit для работающего процесса.

cat /proc/29064/limits
Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            33554432             33554432             bytes
Max core file size        unlimited            unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             1048576              1048576              processes
Max open files            8192000              8192000              files
Max locked memory         16777216             16777216             bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       255238               255238               signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us

Процессы запускаются в докере от рута. В логах по этому поводу ничего нет.

tugrik ★★
() автор топика
Последнее исправление: tugrik (всего исправлений: 1)

Не выключай полностью ipv6.

Он иногда нужен на интерфейсе lo

Загрузи ipv6, отключи на всех интерфейсах ipv6, кроме lo.

sysctl -w net.ipv6.conf.default.disable_ipv6=1
sysctl -w net.ipv6.conf.all.disable_ipv6=1
sysctl -w net.ipv6.conf.lo.disable_ipv6=0

А версия ядра какая?

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от tugrik

Процессы запускаются в докере от рута.

Об докере ничего не скажу. Может проблема в нем, смотри логи докере.

В логах по этому поводу ничего нет.

Аудит в ядре линукса надо включить, в твоем случае необходимо:

CONFIG_GRKERNSEC_SIGNAL=y

sysctl -w kernel.grsecurity.signal_logging=1

Возможно еще и:

CONFIG_GRKERNSEC_FORKFAIL=y

sysctl -w kernel.grsecurity.forkfail_logging=1

Если в твоих исходниках ядра нет этих опций наложи патчи от grsecurity.net

Тогда в логах будет конкретно указано почему ядро убило процесс.

anonymous
()
Ответ на: комментарий от tugrik

Интересно бы посмотреть на потребление памяти при работе процесса.

Возможно он при старте он использует значительно больше памяти.

Отсутствие swap дает максимально жесткую реакцию ядра не возможную нехватку памяти, а приложения частенько просят памяти значительно больше, чем реально используется.

Не смотрел VSZ и RSS в «ps axu» для запущеных приложений ?

vel ★★★★★
()
Ответ на: комментарий от tugrik

Процессы запускаются в докере от рута.

С какими лимитами запускается контейнер и как?

AnDoR ★★★★★
()
Ответ на: комментарий от hakavlad

Каким-то образом это похоже что реально связано с оверкомитом.

root@node16 ~ # sysctl vm.overcommit_memory=2 vm.overcommit_memory = 2 root@node16 ~ # sysctl vm.overcommit_memory -bash: fork: Cannot allocate memory -bash: wait_for: No record of process 17554

При этом память в page cache есть и ее много, на этой ноде сейчас 128GB, в page cache 60GB, free 500MB

С vm.overcommit_memory = 1 похоже что работает, только ставлю 2, получаю Cannot allocate memory в том же bash процессе.

Похоже я как-то сам себя обманул, kubernetes сам ставит overcommit_memory - 1, я не помню почему решил ставить 2. Как-то он совсем не хочет отбирать память у page cache с 2, c 1 - ok.

tugrik ★★
() автор топика
Ответ на: комментарий от tugrik

Кэш тут не причём. Когда ты отключаешь оверкоммит, ты сталкиваешься с той проблемой, из-за которой его придумали: адресного пространства используется гораздо больше, чем реальной памяти.

anonymous
()
Ответ на: комментарий от anonymous

Когда ты отключаешь оверкоммит, ты сталкиваешься с той проблемой

  • cannot allocate memory

адресного пространства используется гораздо больше, чем реальной памяти.

  • это возможно при разрешении оверкоммита, и в этом нет ничего плохого. Пусть хоть терабайты выделяются - виртуальная память бесплатна. А вот запрет оверкоммита может приводить к ошибкам в приложениях и их неопределенному поведению.

А проблему нехватки реальной решают ООМ киллеры - ядерный и юзерспейсные.

anonymous
()

оно съедает память из free но buff/cache не трогается Такого быть не может. Местные афторитеты тут недавно это объясняли. Зачем ты врёшь?

anonymous
()

Swap выключен

98%, что проблема в этом, даже если памяти вроде бы хватает.

anonymous
()
Ответ на: комментарий от anonymous

Выставил в 1 и проблема пока не повторялась. Наблюдаю дальше.

tugrik ★★
() автор топика
Ответ на: комментарий от anonymous

Клован, плез. Он отрубил оверкоммит, потому всё и убивается при свободной памяти. Кэш тут непричём.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.