it-swarm.com.ru

Как установить глобальный лимит файлов, чтобы избежать ошибки "много открытых файлов"?

У меня есть служба веб-сокетов. это странно, что есть ошибка: «слишком много открытых файлов», но я установил конфигурацию системы:

/etc/security/limits.conf
*               soft    nofile          65000
*               hard    nofile          65000

/etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024 65000

ulimit -n
//output 6500

Так что я думаю, что моя система настроена правильно.

Мой сервис управляется супервайзером, возможно ли ограничение супервизора?

проверьте запуск процесса супервизором:

cat /proc/815/limits
Max open files            1024                 4096                 files 

проверьте процесс ручного запуска:

cat /proc/900/limits
Max open files            65000                 65000                 files 

В качестве причины используется супервизор, управляющий обслуживанием. если я перезапускаю супервизор и перезапускаю дочерний процесс, то это «максимальное количество открытых файлов» нормально (65000), но неправильно (1024), когда автоматический запуск системного супервизора запускается. 

Может быть, начальный уровень супервизора слишком высок, а конфигурация системы не работает при старте супервизора?

Правка:

система: Ubuntu 12.04 64bit

Это не проблема супервизора, все процессы запускаются автоматически после перезагрузки системы, не используют настройку системы (макс. Открытых файлов = 1024), но перезагрузите все нормально.

Обновление

Может быть проблема в следующем:

Теперь вопрос в том, как установить глобальный лимит nofile, потому что я не хочу устанавливать лимит nofile в каждом скрипте upstart, который мне нужен.

25
leiyonglin

У меня такая же проблема. Несмотря на то, что ulimit -Sn показывает мой новый лимит, при запуске supervisorctl restart all и cating в файлах proc новые лимиты не отображаются.

Проблема в том, что supervisord все еще имеет исходные ограничения. Поэтому любые дочерние процессы, которые он создает, все еще имеют исходные ограничения.

Итак, решение состоит в том, чтобы убить и перезапустить supervisord.

9
Luqmaan

Исправлена ​​эта проблема, устанавливая ограничения для всех пользователей в файле:

$ cat /etc/security/limits.d/custom.conf
* hard nofile 550000
* soft nofile 550000

Перезагрузите сервер после установки пределов.

ОЧЕНЬ ВАЖНО: Папка /etc/security/limits.d/ содержит определенные пользователем ограничения. В моем случае ограничения, связанные с hadoop 2 (cloudera). Эти пользовательские ограничения переопределяют глобальные ограничения, поэтому, если ваши ограничения не применяются, обязательно проверьте пользовательские ограничения в папке /etc/security/limits.d/ и в файле /etc/security/limits.conf.

ВНИМАНИЕ: Установка определенных пользователем ограничений - это путь, который нужно использовать во всех случаях. Установки глобального (*) предела следует избегать. В моем случае это была изолированная среда, и мне просто нужно было устранить проблему с ограничениями файлов в моем эксперименте. 

Надеюсь, это спасет кого-то от волос - ведь я потратил слишком много времени, вытаскивая свои волосы из куска!

9
OkezieE

Любому утомленному гуглуру: вы можете искать параметр minfds в конфигурацию супервизора . Похоже, что этот параметр действует как для процесса надзора, так и для детей. У меня был ряд других стратегий, включая запуск сценария Shell, который устанавливал ограничения перед выполнением реальной программы, но это было единственное, что сработало.

5
Dan

Попробуйте отредактировать /etc/sysctl.conf и отрегулировать ограничения глобально Например:

Принудительно ограничивает до 100000 файлов. 

vi /etc/sysctl.conf

Append:

fs.file-max = 100000

Сохраните и закройте файл. Чтобы изменения вступили в силу, пользователям необходимо выйти и снова войти в систему или просто введите следующую команду:

sysctl -p
4
Giovanni Silva

Вы можете найти свой лимит с помощью:

 cat /proc/sys/fs/file-max

или sysctl -a | grep file

измените его в файле/proc/sys/fs/file-max или с помощью:

sysctl -w fs.file-max=100000
2
Dimitrios

ответ luqmaan был для меня билетом, за исключением одного небольшого предостережения: подстановочный знак * не применяется к root в Ubuntu (как описано в комментариях limits.conf).

Вам необходимо явно установить ограничение для root, если supervisord запущен от имени пользователя root:

vi /etc/security/limits.conf

root soft nofile 65535
root hard nofile 65535
2
lextoumbourou

Можете ли вы установить ограничение на обслуживание следующим образом:

добавить: LimitNOFILE=65536 in: /etc/systemd/system/{NameofService}.service

1