Как изменить ограничение количества открытых файлов в Linux? [закрыто]


194

При запуске моего приложения я иногда получаю сообщение об ошибке too many files open.

Запуск ulimit -aотчетов о том, что лимит составляет 1024. Как мне увеличить лимит выше 1024?

Редактировать ulimit -n 2048 результаты в ошибке разрешения.



Я только что прошел это на Centos 7 (то же самое на RHEL) и сделал пост в блоге, освещающий это, потому что у меня было так много проблем даже со всеми этими сообщениями: coding-stream-of-consciousness.com/2018/12/21/… . Часто наряду с открытыми файлами вам нужно увеличить nproc, который фактически находится в нескольких файлах настроек ... и если вы используете systemd / systemctl, который имеет свои собственные отдельные настройки. Это отчасти орехи.
Джон Хамфрис -

Если вы используете VSCode в Linux, этот обходной путь может помочь: stackoverflow.com/a/55027686/1190948
Юри Синицон

Ответы:


153

Вы всегда можете попробовать сделать ulimit -n 2048. Это только сбросит лимит для вашей текущей оболочки, и указанное вами число не должно превышать жесткий лимит.

Каждая операционная система имеет различные жесткие ограничения в файле конфигурации. Например, ограничение на количество открытых файлов в Solaris может быть установлено при загрузке из / etc / system.

set rlim_fd_max = 166384
set rlim_fd_cur = 8192

В OS X эти же данные должны быть установлены в /etc/sysctl.conf.

kern.maxfilesperproc=166384
kern.maxfiles=8192

В Linux эти настройки часто находятся в /etc/security/limits.conf.

Есть два вида ограничений:

  • мягкие ограничения - это просто текущие ограничения
  • жесткие ограничения обозначают максимальное значение, которое не может быть превышено путем установки мягкого ограничения

Мягкие ограничения могут быть установлены любым пользователем, в то время как жесткие ограничения могут быть изменены только пользователем root. Лимиты являются свойством процесса. Они наследуются при создании дочернего процесса, поэтому общесистемные ограничения должны быть установлены во время инициализации системы в сценариях инициализации, а пользовательские ограничения должны быть установлены при входе пользователя, например, с помощью pam_limits.

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


4
Можете ли вы сказать мне, как использовать это в Windows?
Притам

@ hoyhoy Я могу изменить это как, 2048но не как 4500почему? посмотри на это
alhelal

@GaneshKrishnan, что добавить в файлы Linux, которые вы упомянули?
Aviral Sanjay

@Pritam Windows не имеет ulimit. Вы должны указать, что вы используете (например, WSL, Cygwin).
Мелебиус

99

Если вы используете Linux и получили ошибку разрешения, вам нужно будет увеличить допустимый предел в файле /etc/limits.confили /etc/security/limits.conf(где файл находится в зависимости от вашего конкретного дистрибутива Linux).

Например, чтобы разрешить кому-либо на компьютере увеличить количество открытых файлов до 10000, добавьте строку в limits.confфайл.

* hard nofile 10000

Затем выйдите из системы и войдите в свою систему, и вы сможете сделать:

ulimit -n 10000

без ошибки разрешения.


6
ПРИМЕЧАНИЕ. Подстановочный знак не распространяется на rootпользователя. Вы должны указать root hard nofile 10000, хотите ли вы настроить rootограничение.
Джошуа Пинтер

1
@JoshPinter Хаха, я только что провел последние 3 часа или около того, просматривая каждый урок о том, как изменить ulimitи, наконец, узнал, что я вошел в систему как root. Вот почему я продолжал видеть 1024 в ulimit -a. Я изменил wildcare и добавил *внутрь limits.conf. Теперь все хорошо (я использую ssh-ключи, не волнуйтесь: P) - Спасибо !!!
NiCk Newman

1
@NiCkNewman Я рад, что ты смеешься над этим! Это хорошая черта программиста / сисопа. Я сделал то же самое и не был таким веселым. Рад, что это помогло! :)
Джошуа Пинтер

За дополнительную плату: Вы можете найти также конфиг в этой директории: /etc/security/limits.d/.
Вальдемар Восински,

2
Я впервые открыл /etc/security/limits.conf и заметил, что там все закомментировано. Каково значение по умолчанию "hard nofile" тогда?
ka3ak

36

1) Добавьте следующую строку в /etc/security/limits.conf

webuser hard nofile 64000

затем войдите как веб-пользователь

su - webuser

2) Отредактируйте следующие два файла для веб-пользователя

добавьте файлы .bashrc и .bash_profile , запустив

echo "ulimit -n 64000" >> .bashrc ; echo "ulimit -n 64000" >> .bash_profile

3) Выйдите из системы, затем снова войдите в систему и убедитесь, что изменения были внесены правильно:

$ ulimit -a | grep open
open files                      (-n) 64000

Вот оно и их бум, бум бум.


9
Если вы измените свою строку в limit.conf с 'hard' на 'soft', она должна стать новой по умолчанию и не требовать изменений в профилях bash.
RishiD

Кажется, вы повторяете дополнительные шаги. Установка пределов сама по себе будет такой же, как профиль, но для всех сеансов.
Эдди

6

Если некоторые из ваших сервисов переходят в ulimits, иногда проще поместить соответствующие команды в init-скрипт сервиса. Например, когда Apache сообщает

[alert] (11) Ресурс временно недоступен: apr_thread_create: невозможно создать рабочий поток

Попробуйте положить ulimit -s unlimitedв /etc/init.d/httpd. Это не требует перезагрузки сервера.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.