Nginx — Too many open files

Небольшая заметка по одной из ошибок nginx, с которой вы можете столкнуться по мере роста нагрузки на web сервер. Исправляется она легко, но я оставлю небольшие комментарии по ней, чтобы было понимание причины.

Полностью эта ошибка будет выглядеть примерно так:

К этой ошибке приводит системное ограничение на количество открытых файлов для рабочего процесса. Посмотреть это ограничение можно простой командой в консоли.

Она равна 1024. Можно изменить системные лимиты, но есть более простое и разумное решение. Нет смысла менять системный лимит, если нас интересуют только процессы nginx. Для изменения лимита только для них, если отдельный параметр в конфигурации nginx — worker_rlimit_nofile.

Остается один вопрос — какое значение туда поставить. Я нашел информацию, что на каждое соединение nginx открываются два файловых дескриптора — один на соединение, один непосредственно на открытие файла. Я не смог найти подтверждения, но даже если эта информация не верна, ничего страшного не будет, если мы каждому соединению оставим 2 файловых дескриптора.

Теперь рассчитаем, какое значение в параметре worker_rlimit_nofile нам надо установить. Допустим, у нас есть 4-х ядерный сервер с такими параметрами nginx:

В данном случае у нас количество запущенных процессов будет автоматически равно количеству ядер. А на один процесс разрешено 5120 соединений. Таким образом, суммарно у нас может быть 5120 * 4 = 20480 соединений. На каждое соединение нужно 2 файловых дескриптора. Значит параметр worker_rlimit_nofile должен быть равен 40960:

После изменения достаточно просто перечитать конфигурацию.

Проверить, применились ли новые лимиты на процессы nginx можно, выполнив следующую команду в консоли:

Все в порядке, системный лимит остался дефолтным, а для процессов nginx изменился.

Обновлено: 20.03.2019 — 15:25

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *