Кеширующий сервер падает: мало места под разделяемую память
Кеширующий сервер держит журнал работы в разделяемой памяти на временной файловой системе. Если раздел меньше заявленного размера, служба либо не запускается, либо теряет записи. Раздел этот отдельный и по умолчанию невелик.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Раздел временной файловой системы меньше заявленного размера
Служба заявляет размер журнала работы, а раздел его не вмещает. Запуск отказывает.
-
Кеш в памяти больше доступной памяти
Заявленный размер кеша в памяти вместе с накладными расходами превышает доступное, и процесс останавливается ядром.
-
Журнал работы теряется при перезапуске
Разделяемая память очищается при перезапуске службы. Сбор статистики и разбор по журналу работы после перезапуска невозможны.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Сообщения службы при запуске.
journalctl -u varnish -n 30 --no-pagerРаздел под разделяемую память и его размер.
findmnt /var/lib/varnish -o TARGET,FSTYPE,SIZE,AVAILЗаявленные размеры кеша и журнала работы.
systemctl cat varnish | grep -i ExecStartРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Служба заявляет размер журнала работы, а раздел его не вмещает. Запуск отказывает.
- Как проверить
-
Посмотрите заявленный размер и раздел.
systemctl cat varnish 2>/dev/null | grep -iE "ExecStart|-l " findmnt /var/lib/varnish -o TARGET,FSTYPE,SIZE 2>/dev/null
- Как исправить
- Увеличьте раздел под разделяемую память или уменьшите заявленный размер журнала работы. Выносить его на диск не стоит: это замедлит службу.
- Почему происходит
- Заявленный размер кеша в памяти вместе с накладными расходами превышает доступное, и процесс останавливается ядром.
- Как проверить
-
Посмотрите заявленный размер кеша и память.
systemctl cat varnish 2>/dev/null | grep -oE "malloc,[0-9]+[mMgG]" free -h; systemctl show varnish -p MemoryMax 2>/dev/null
- Как исправить
- Задайте размер кеша с запасом от доступной памяти и согласуйте его с пределом памяти службы. Накладные расходы заметны и их надо учитывать.
- Почему происходит
- Разделяемая память очищается при перезапуске службы. Сбор статистики и разбор по журналу работы после перезапуска невозможны.
- Как проверить
-
Посмотрите время запуска службы и доступность журнала работы.
systemctl show varnish -p ExecMainStartTimestamp 2>/dev/null varnishstat -1 2>/dev/null | head -5
- Как исправить
- Собирайте статистику непрерывно отдельной службой, а не по запросу. Иначе каждый перезапуск обнуляет картину.
Пример вывода
Раздел меньше заявленного размера журнала работы. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
varnishd[7700]: Error: Cannot open /var/lib/varnish/vsm_mgt/_.index: No space left on device
varnishd[7700]: (-junix,user=varnish) failed to create shared memory
systemd[1]: varnish.service: Main process exited, code=exited, status=1/FAILURE
Связанные ошибки
- No space left on device в журнале службы Нет места на устройстве: разбор по свободным блокам, по inode, по журналу systemd и по удалённым, но открытым файлам.
- tmpfs заполняется и служба падает Временная файловая система в памяти заполнена: размер по умолчанию, растущие данные, ограничение в unit.
- Failed with result 'oom-kill' Состояние oom-kill: процесс службы убит из-за нехватки памяти. Как понять, упёрлись в предел службы или в память машины.
- Cannot allocate memory в журнале службы Не удалось выделить память: предел службы, память машины, настройка overcommit, исчерпанные области отображения.
- Elasticsearch: служба падает из-за размера кучи JVM Размер кучи больше доступной памяти или больше предела службы: падение при старте или под нагрузкой.
- Hardware Error / EDAC: ошибки памяти в журнале Ядро сообщает об ошибках памяти. Что считать безобидным, а что поводом менять модуль.
- Java-служба: OutOfMemoryError и куча Служба на JVM падает с нехваткой памяти: размер кучи, предел контрольной группы, дампы кучи.
- MySQL убит из-за памяти: буферный пул больше доступной памяти MySQL падает сразу после старта или через минуты: размер innodb_buffer_pool_size превышает память машины.
Источники
- Документация Varnish
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено уменьшением раздела под разделяемую память.