розуміння максимальних дескрипторів файлів для Linux та nginx, а також найкраще значення для Working_rlimit_nofile


10

У мене начебто поширена помилка "занадто багато дескрипторів файлів" на nginx. Після довгого пошуку, рішення очевидно збільшити кількість дескрипторів файлів, доступних nginx. Але там недостатньо інформації, щоб мені було комфортно робити це змістовно і безпечно. Ось основні моменти, які висвітлює більшість потоків форуму / електронної пошти:

  • ОС має власний загальний ліміт дескриптора файлів (у моїй системі, cat /proc/sys/fs/file-maxвиводить "100678")
  • кожен користувач також може мати власний ліміт (але в моїй системі працює, ulimitяк будь-який користувач виводить "необмежено", див. оновлення знизу з більш детальною інформацією )
  • кілька людей сказали щось, що відповідає цій людині : "Директива delav_rlimit_nofile не вказує" скільки ", це обмеження операційної системи. Директива worker_rlimit_nofile просто дозволяє швидким і брудним способом збільшити цю межу, якщо її недостатньо. " Тож я гадаю, що сенс полягає в тому, що «краще» встановити ліміт для користувача nginx OS, а не в конфігурації?

Я можу просто закинути значення delav_rlimit_nofile, що перевищує кількість підключень на одного працівника, і називати це за день, але я відчуваю, що не знаю, що тут відбувається.

  • чому ліміт на одного працівника буде меншим, ніж межа ОС?
  • Як дізнатися, яка зараз моя межа?

оновлення : як для кореня, так і для звичайного користувача, скасуйте висновки "необмежено", АЛЕ ulimit -Hnта ulimit -Snобидва виведення 1024

Відповіді:


10

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

Після цих лімітів безпеки я вважаю, що мені все ж довелося збільшити програмний ліміт для користувача, який використовує ulimit.

Як дізнатися, яка зараз моя межа?

ulimit -a Буде відображено всі обмеження, пов'язані з користувачем, для якого ви його запустите.


1
Дякую - тепер, коли я збільшив ліміт дескриптора файлів, у мене не вистачає з'єднань. Можливо, ви можете мені допомогти і з цим :) serverfault.com/questions/209014/…
Джон

1
Зауважте для користувачів CentOS / Fedora, якщо у вас ввімкнено SELinux, вам потрібно буде запустити setsebool -P httpd_setrlimit 1так, щоб nginx мав дозволи встановити його обмеження.
Джарретт

2

Доведеться перевірити джерело, щоб бути чесним, але воно досить низьке.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.