Назад | Перейти на главную страницу

понимание максимальных файловых дескрипторов для linux и nginx, а также лучшее значение для worker_rlimit_nofile

Я получил, казалось бы, обычную ошибку "слишком много файловых дескрипторов" на nginx. После долгих поисков решение очевидно - увеличить количество файловых дескрипторов, доступных для nginx. Но информации недостаточно, чтобы я чувствовал себя комфортно, делая это осмысленным и безопасным способом. Вот основные моменты, которые освещаются в большинстве форумов / электронных писем:

Я могу просто добавить значение worker_rlimit_nofile, превышающее количество подключений на одного рабочего, и назвать это днем, но я чувствую, что действительно не знаю, что здесь происходит.

Обновить: и для root, и для обычного пользователя ulimit выводит "неограниченно", НО ulimit -Hn и ulimit -Sn оба выходят 1024

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

Во-первых, что использует ваши файловые дескрипторы?

  1. Каждое активное соединение с клиентом
  2. Используете proxy_pass? Это откроет сокет для хоста: порт, обрабатывающий эти запросы
  3. Используете proxy_pass для локального порта? Это еще одна открытая розетка. (Для владельца этого процесса)
  4. статические файлы, обслуживаемые nginx

Почему ограничение на одного работника должно быть меньше лимита ОС?

Это контролируется ОС, потому что рабочий - не единственный процесс, запущенный на машине. Чтобы изменить его для пользователя, работающего с nginx, см. Ниже. Было бы очень плохо, если бы ваши воркеры использовали все файловые дескрипторы, доступные для всех процессов, не устанавливайте свои ограничения, чтобы это было возможно.

#/etc/sysctl.conf
#This sets the value you see when running cat  /proc/sys/fs/file-max
fs.file-max = 65536"


#/etc/security/limits.conf
#this sets the defaults for all users
* soft nofile 4096
* hard nofile 4096

#This overrides the default for user `usernamehere`
usernamehere soft nofile 10240
usernamehere hard nofile 10240

Я считаю, что после этих изменений ограничений безопасности мне все же пришлось увеличить softlimit для пользователя, использующего ulimit.

Как мне узнать, какой у меня сейчас лимит?

ulimit -a Отобразит все ограничения, связанные с пользователем, от имени которого вы его запускаете.

Если честно, нужно проверить источник, но он довольно низкий.

я использовал worker_rlimit_nofile 15000; и не было проблем, вы можете смело увеличивать его, хотя вероятность исчерпания файловых дескрипторов мала.