Как установить глобальный лимит файлов, чтобы избежать ошибки "много открытых файлов"?
У меня есть служба веб-сокетов. Странно, что есть ошибка: "слишком много открытых файлов", но я установил конфигурацию системы:
/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, который мне нужен.
Ответы
Ответ 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. Запустите приложение снова.