Подтвердить что ты не робот

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

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

/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, который мне нужен.

4b9b3361

Ответ 1

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

$ 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.

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Выдает ограничение на 100 000 файлов.

vi /etc/sysctl.conf

Append:

fs.file-max = 100000

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

sysctl -p

Ответ 5

Вы можете найти ограничение:

 cat /proc/sys/fs/file-max

или sysctl -a | grep file

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

sysctl -w fs.file-max=100000

Ответ 6

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

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

vi /etc/security/limits.conf

root soft nofile 65535
root hard nofile 65535

Ответ 7

Можете ли вы установить предел для Сервиса таким образом:

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

Ответ 8

Я думаю, что это не имеет ничего общего с открытыми файлами (это просто неправильное сообщение об ошибке). Любой порт, который использует ваше приложение. 1. Попробуйте найти идентификатор процесса с помощью команды

ps aux

2. Убейте процесс (например, 8572) командой

sudo kill -9 8572

3. Запустите приложение снова.