Коллеги, сегодня поговорим о проблеме, которая может незаметно гробить ваши приложения в продакшене. Речь о лимите одновременных процессов (nproc)
➡️ Что происходит:
По умолчанию во многих дистрибутивах лимит nproc установлен в 4096 процессов на пользователя. Для высоконагруженных приложений (особенно в Go, Java, Python с асинхронностью) этого может не хватить. Процессы начинают падать с ошибкой fork: retry: Resource temporarily unavailable, хотя память и CPU в норме
Почему это бесит:
⏩ Ошибка маскируется под другие проблемы
⏩ На тестовых стендах всё работает
⏩ В мониторинге нет явных аномалий
⏩ Расследование может занять часы
Проверка и решение:
# Текущий лимит
ulimit -u
# Постоянное решение в /etc/security/limits.conf
* soft nproc 65536
* hard nproc 65536
# Для systemd-сервисов добавляем в сервис-файл
[Service]
LimitNPROC=65536
‼️ Важно: После изменения limits.conf нужен перелогин. Для systemd-сервисов — перезапуск сервиса
В действительно нагруженных системах может недостаточно даже таких лимитов, поэтому вот пример подобного файла от действующего сервера:
* hard nproc infinity
* soft nproc infinity
root hard nproc infinity
root soft nproc infinity
* hard nofile 1048576
* soft nofile 1048576
root hard nofile 1048576
root soft nofile 1048576
* hard memlock 64
* soft memlock 64
root hard memlock 64
root soft memlock 64
* hard sigpending infinity
* soft sigpending infinity
root hard sigpending infinity
root soft sigpending infinity
Сталкивались с подобным? Делитесь в комментариях — какие лимиты выставляете, чтобы потом не ловить падения?