Як змінити ліміт кількості відкритих файлів у Linux? [зачинено]


194

Під час запуску програми я інколи отримую помилку too many files open.

Запуск ulimit -aзвітів, що ліміт становить 1024. Як я можу збільшити ліміт вище 1024?

Редагувати ulimit -n 2048 результати в помилці дозволу.



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

Якщо ви використовуєте VSCode на Linux цей обхідний шлях може допомогти: stackoverflow.com/a/55027686/1190948
Juri Sinitson

Відповіді:


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.

Існує два види обмежень:

  • м'які межі - це просто застосовувані в даний час межі
  • жорсткі межі відзначають максимальне значення, яке не можна перевищити, встановивши м'яку межу

М'які межі може встановлювати будь-який користувач, тоді як жорсткі обмеження можуть змінюватися лише корінцем. Обмеження є властивістю процесу. Вони успадковуються, коли створюється дочірній процес, тому слід встановити загальносистемні обмеження під час ініціалізації системи в сценаріях init, а обмеження користувачів повинні бути встановлені під час входу користувача, наприклад, за допомогою pam_limits.

Часто за замовчуванням встановлюється машина, коли завантажується машина. Отже, незважаючи на те, що ви можете скинути ваш 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

Якщо деякі з ваших служб перетворюються на ліміти, іноді простіше помістити відповідні команди в сценарій init-сервісу. Наприклад, коли Apache звітує

[сигнал] (11) Ресурс тимчасово недоступний: apr_thread_create: не вдається створити робочу нитку

Спробуйте поставити ulimit -s unlimitedв /etc/init.d/httpd. Для цього не потрібно перезавантажити сервер.

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