@zzmaster

Как пофиксить проблемы с памятью?

На неслабом, в общем то сервере на любую команду выдается

-bash: fork: Cannot allocate memory


в редкий момент просветления получил top
top - 17:52:36 up 50 days,  6:13,  1 user,  load average: 1.01, 1.13, 1.03
Tasks: 1868 total,   2 running, 1866 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.8 us, 33.9 sy,  0.0 ni, 64.4 id,  0.8 wa,  0.0 hi,  0.0 si,  0.2 st
KiB Mem :  2052332 total,    59784 free,  1930936 used,    61612 buff/cache
KiB Swap:        0 total,        0 free,        0 used.    12570 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
   37 root      20   0       0      0      0 R  52.4  0.0 126:43.98 kswapd0
 5553 mysql     20   0  691788 147584      0 S   6.9  7.2  31:10.36 mysqld
15691 root      20   0   48052   3160    556 R   4.4  0.2   0:00.43 top
  455 root      20   0  572420  16564      0 S   1.6  0.8  55:10.43 containerd
26602 root      20   0  298640  15884      0 S   1.6  0.8   6:07.22 php
 5456 root      20   0  725056  18412      0 S   1.3  0.9   7:01.30 core
  736 root      20   0  417512 141040      0 S   0.9  6.9 233:22.80 fail2ban-s+
 5667 root      20   0 1363264 113900      0 S   0.9  5.5  26:30.04 core
    7 root      20   0       0      0      0 S   0.3  0.0  31:45.10 rcu_sched
  142 root      20   0       0      0      0 S   0.3  0.0   3:11.06 jbd2/vda5-8
  854 ntp       20   0  102104    584      0 S   0.3  0.0   4:06.90 ntpd
15602 root      20   0       0      0      0 S   0.3  0.0   0:00.10 kworker/u4+
    1 root      20   0  270292  67236      0 S   0.0  3.3   1:17.53 systemd
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.36 kthreadd
    3 root      20   0       0      0      0 S   0.0  0.0   2:17.78 ksoftirqd/0
    5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:+
    8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh


лично мне непонятно - свапа в системе вроде как нет, но половину CPU съедает процесс kswapd0.

Еще очень много sleeping tasks. Я подозреваю, что они возникли так:
На сревере крутится php процесс, который хотелось бы иметь постоянно работающим. Там стоит set_time_limit(0); Но, понятно, что это не гарантирует от разных форсмажоров. Потому, этот процесс запускается кроном каждую минуту и первым делом смотрит - есть ли дубль в ps axu. Если есть - то прекращает работу. Вероятно, в какой-то момент система оказалась сильно загруженной и процесс хоть и запустился, но не смог даже проверить на дубль. Через 1 минуту это повторилось ну и так далее.

Значит, у меня 2 вопроса.

1. Поможет ли в описанной ситуации создание свап файла? Или он таки уже есть?
2. Как организовать чтоб нужный php скрипт гарантировано выполнялся, а в случае краха - перезапускался?

Спасибо.
  • Вопрос задан
  • 2814 просмотров
Пригласить эксперта
Ответы на вопрос 2
@vitaly_il1
DevOps Consulting
Вывод top можно отсортировать по памяти - нажать внутри top Shift/M.
А еще лучше запустить их cron каждые пять минут

top -b -o +%MEM | head -20 >> /tmp/top-memory.out

Так мы быстро поймем кто жрет память.

Еще вариант - посчитать PHP processes:

ps -ef | grep php | wc -l

Возможно ваш скрипт плохо умеет убивать лишние инстансы

Поможет ли в описанной ситуации создание свап файла? Или он таки уже есть?

Пока нет:
KiB Swap: 0 total,

Можно создать, но скорее всего это просто отсрочит проблему.
Ответ написан
Комментировать
Известная проблема ядра Linux, описанная, например, здесь.

В двух словах: при недостатке оперативной памяти, а у вас её осталось, судя по top, 59 МБ из 2 ГБ (2%), система начинает крайне плохо отвечать на запросы. Поэтому причину в загрузке CPU искать не стоит.
Вам нужно поработать над оптимизацией использования оперативной памяти или её увеличением. Включение swap если и поможет, то ненадолго.

Ошибка "Cannot allocate memory" как раз об этом -- память не удаётся выделить, просто потому что свободной её нет.

Процессы, перечисленные у вас в выводе top, даже близко столько памяти не занимают -- ищите проблему среди ваших спящих процессов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы