signal=XCPU и signal=XFSZ в systemd
Эти два сигнала посылает ядро, когда процесс вышел за жёсткие пределы ресурсов, заданные в unit-файле: XCPU — превышено процессорное время из LimitCPU=, XFSZ — попытка превысить размер файла из LimitFSIZE=. Оба случая означают, что предел задан теснее реальных потребностей службы.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Превышен предел процессорного времени
LimitCPU=ограничивает суммарное процессорное время процесса, а не его долю. Для постоянно работающей службы такой предел рано или поздно исчерпается — и она будет умирать раз в сутки или раз в неделю с аккуратной регулярностью. -
Превышен предел размера файла
LimitFSIZE=запрещает создавать файлы больше указанного размера. Служба, ведущая собственный журнал или базу, упирается в него при росте файла. -
Пределы унаследованы из шаблона unit-файла
Ограничения переносят из чужих примеров, не сопоставляя с потребностями своей службы. Особенно часто так попадает
LimitCPU=.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Пределы и фактический расход процессорного времени.
systemctl show myapp.service | grep -E "^Limit(CPU|FSIZE)|CPUUsage"Момент падения и регулярность: одинаковый интервал между падениями указывает на исчерпание предела.
journalctl -u myapp.service -n 30 --no-pagerРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
LimitCPU=ограничивает суммарное процессорное время процесса, а не его долю. Для постоянно работающей службы такой предел рано или поздно исчерпается — и она будет умирать раз в сутки или раз в неделю с аккуратной регулярностью.
- Как проверить
-
Посмотрите предел и потреблённое время.
systemctl show myapp.service -p LimitCPU -p CPUUsageNSec
- Как исправить
-
Для длительно работающих служб
LimitCPU=обычно не нужен: уберите его, а долю процессора ограничивайте черезCPUQuota=, которая не копит расход.CPUQuota=80%
- Почему происходит
LimitFSIZE=запрещает создавать файлы больше указанного размера. Служба, ведущая собственный журнал или базу, упирается в него при росте файла.
- Как проверить
-
Посмотрите предел и размеры файлов службы.
systemctl show myapp.service -p LimitFSIZE sudo du -ah /var/lib/myapp | sort -h | tail -5
- Как исправить
- Поднимите предел или настройте ротацию файлов. Предел размера файла удобен как страховка от бесконтрольного роста, но его значение должно быть с запасом.
- Почему происходит
- Ограничения переносят из чужих примеров, не сопоставляя с потребностями своей службы. Особенно часто так попадает
LimitCPU=.
- Как проверить
-
Посмотрите все пределы службы разом.
systemctl show myapp.service | grep ^Limit
- Как исправить
- Оставьте только те пределы, которые вы можете обосновать числом. Остальные уберите: непонятный предел опаснее отсутствующего.
Пример вывода
Служба исчерпала предел процессорного времени. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
× worker.service - Background worker
Active: failed (Result: signal) since Mon 2026-09-15 18:00:12 MSK; 5s ago
Main PID: 18900 (code=killed, signal=XCPU)
systemd[1]: worker.service: Main process exited, code=killed, status=24/XCPU
systemd[1]: worker.service: Failed with result 'signal'.
Связанные ошибки
- status=205/LIMITS в systemd Код 205/LIMITS: systemd не смог применить ограничения ресурсов из Limit*=. Обычно значение недопустимо или превышает жёсткий предел.
- Failed with result 'signal' Состояние signal: процесс службы завершён сигналом без сохранения дампа. Как узнать, каким сигналом и от кого.
- No space left on device в журнале службы Нет места на устройстве: разбор по свободным блокам, по inode, по журналу systemd и по удалённым, но открытым файлам.
- status=204/MEMORY в systemd Код 204/MEMORY: systemd не смог выделить память при подготовке запуска службы. Что проверять на машине и в unit-файле.
- status=207/SIGNAL_MASK в systemd Код 207/SIGNAL_MASK: systemd не смог установить маску сигналов для нового процесса. Редкий код, признак проблем в окружении.
- Cannot allocate memory в журнале службы Не удалось выделить память: предел службы, память машины, настройка overcommit, исчерпанные области отображения.
- Disk quota exceeded для службы Место на разделе есть, а запись отклоняется: исчерпана дисковая квота пользователя или группы.
- Elasticsearch: max virtual memory areas vm.max_map_count is too low Elasticsearch отказывается стартовать из-за заниженного vm.max_map_count. Как поднять значение и закрепить его.
Источники
-
systemd.exec(5)
LimitCPU= и LimitFSIZE=: жёсткие пределы и последствия их превышения. -
systemd.resource-control(5)
CPUQuota= как правильная замена ограничению процессорного времени. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено на unit с LimitCPU=10 и LimitFSIZE=1M.