tmpfs заполняется и служба падает
Временная файловая система живёт в памяти, и её размер ограничен. Служба, пишущая туда много данных, заполняет её и получает отказ — а память при этом занята и не освобождается до удаления файлов.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Размер задан по умолчанию и мал
Без явного размера временная файловая система получает половину памяти машины, но для /run и подобных каталогов размер обычно меньше.
-
Служба пишет в память постоянные данные
Данные в такой файловой системе исчезают при перезагрузке и занимают память. Для состояния службы это неподходящее место.
-
Место занято удалёнными файлами
Как и на диске, память не освобождается, пока файл держит процесс. Команда покажет занятое место при видимой пустоте каталога.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Занятость временных файловых систем.
df -h /run /tmp /dev/shmЧто занимает место в /run.
sudo du -sh /run/* 2>/dev/null | sort -h | tailРазмеры и использование всех tmpfs.
findmnt -t tmpfs -o TARGET,SIZE,USEDРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Без явного размера временная файловая система получает половину памяти машины, но для /run и подобных каталогов размер обычно меньше.
- Как проверить
-
Посмотрите размеры и занятость.
df -h /run /tmp /dev/shm findmnt -t tmpfs -o TARGET,SIZE,USED,OPTIONS
- Как исправить
- Задайте размер явно в записи монтирования или в mount-unit. Для данных, не требующих скорости памяти, лучше обычный каталог на диске.
- Почему происходит
- Данные в такой файловой системе исчезают при перезагрузке и занимают память. Для состояния службы это неподходящее место.
- Как проверить
-
Посмотрите, что и куда пишет служба.
sudo du -sh /run/* 2>/dev/null | sort -h | tail -5
- Как исправить
-
Перенесите постоянные данные в каталог состояния через
StateDirectory=: он на диске и переживает перезагрузку.
- Почему происходит
- Как и на диске, память не освобождается, пока файл держит процесс. Команда покажет занятое место при видимой пустоте каталога.
- Как проверить
-
Найдите удалённые открытые файлы.
sudo lsof +L1 2>/dev/null | grep -E "tmpfs|/run" | head
- Как исправить
- Перезапустите службу, которая держит файлы.
Пример вывода
Служба заполнила /run данными. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ df -h /run
tmpfs 790M 790M 0 100% /run
myapp[1200]: error: write /run/myapp/queue.dat: no space left on device
Связанные ошибки
- No space left on device в журнале службы Нет места на устройстве: разбор по свободным блокам, по inode, по журналу systemd и по удалённым, но открытым файлам.
- status=233/RUNTIME_DIRECTORY в systemd Код 233/RUNTIME_DIRECTORY: не удалось подготовить каталог службы в /run из RuntimeDirectory=. Права, режим, удаление при остановке.
- Место есть, а файлы не создаются: кончились inode Ошибка о нехватке места при свободном диске: исчерпаны записи файловой системы. Как найти каталог с миллионом файлов.
- Automount: каталог монтируется не вовремя или отваливается Автомонтирование через .automount: как работает TimeoutIdleSec, почему ресурс отваливается и когда лучше обычный .mount.
- Cannot allocate memory в журнале службы Не удалось выделить память: предел службы, память машины, настройка overcommit, исчерпанные области отображения.
- Dependency failed for … и результат 'dependency' Сообщение Dependency failed for: служба не запускалась, потому что упала её зависимость. Как найти настоящего виновника.
- Device or resource busy при операции с файлом Ошибка 16: файл или устройство заняты. Разбор для точек монтирования, устройств и файлов конфигурации.
- Elasticsearch: служба падает из-за размера кучи JVM Размер кучи больше доступной памяти или больше предела службы: падение при старте или под нагрузкой.
Источники
-
systemd.mount(5)
Параметры временной файловой системы, включая размер. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено записью крупных файлов в /run.