Получи случайную криптовалюту за регистрацию!

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.