Linux, supervisord и максимальное количество открытых файлов | EazyDev
Linux, supervisord и максимальное количество открытых файлов
Настройки ядра Linux
Одно из первого, что мы делаем, когда запускаем потенциально загруженный сервер - тюним ядро для возможности принимать и обрабатывать большое количество соединений. Важными параметрами тут являются:
- somaxconn - backlog-очередь установленных соединений;
- tcp_max_syn_backlog - очередь для не полностью установленных соединений;
- fs.file-max - максимально допустимое количество открытых дескрипторов в системе (обычно он достаточно высокий).
Помимо этих параметров, есть еще /etc/security/limits.conf, который устанавливает всяческие ограничения на уровне пользователя. Среди ограничений в этом файле, есть 1 очень важное - nofile или максимальное количество открытых файловых дескрипторов для процесса, максимальное значение которого, обычно 4096, то для высоконагруженных приложений очень мало. В linux, сокеты - это тоже файлы поэтому этот лимит так же включает сетевые соединения.
Supervisord
Supervisord - достаточно старый инструмент написанный на python, который используется для запуска приложений в фоне и их рестарт, в случае падения. Он все еще активно используется для legacy-приложений, которые не отмигрировались на docker. Пример конфигурации приложения на nodejs:
[program:app]
command=/usr/bin/node index.js
autostart=true
autorestart=true
user=app
redirect_stderr=true
stdout_logfile_maxbytes=200MB
stderr_logfile=/var/logs/app/stderr.log
stdout_logfile=/var/logs/app/stdout.log
environment=NODE_ENV="production"
directory=/app/
Огромная проблема в том, что по умолчанию, supervisord задает свой лимит на количество файлов, игнорируя системные из /etc/security/limits.conf. В этом можно убедиться, запустив программу и посмотрев файл /proc/%d/limits:
# cat /proc/%d/limits | grep "open files"
Max open files 1024 4096 files
Чтобы это пофиксить, необходимо добавить в supervisord.conf параметр minfds с новым значением:
[supervisord]
...
minfds=15000;
И рестартнуть сервисы.
Наиболее лучшим решением будет миграция на systemd или docker.