Збільшити максимальну кількість дескрипторів відкритих файлів у Snow Leopard?


101

Я намагаюся зробити щось, для чого потрібна велика кількість дескрипторів файлів

sudo ulimit -n 12288настільки високий, наскільки Сніговий Леопард хоче піти; поза цим результатами в

/ usr / bin / ulimit: рядок 4: ulimit: відкриті файли: не вдається змінити ліміт: недійсний аргумент.

Я хочу підняти число набагато вище, скажімо, 100000. Це можливо?


4
Відповіді на це питання більше не працюють у OSX Mavericks.
Говард

2
Запуск echo limit maxfiles 10000 10000|sudo tee -a /etc/launchd.confі перезапуск працює для мене в Mavericks.
Лрі

Відповіді:


95

Використання ulimitкоманди лише змінює обмеження ресурсів для поточної оболонки та її дітей та sudo ulimitстворює кореневу оболонку, коригує її межі, а потім виходить (таким чином, наскільки я бачу, ніякого реального ефекту).
Щоб перевищити 12288, вам потрібно відкоригувати параметри ядра kern.maxfilesта kern.maxfilesperprocпараметри, а також (принаймні відповідно до цього запису в блозі , який є підсумком цієї дискусії ) обмеженням запуску. Ви можете launchctl limitскоригувати все це відразу:

sudo launchctl limit maxfiles 1000000 1000000

Щоб зробити це постійним (тобто не скинути під час перезавантаження), створіть, /etc/launchd.confщо містить:

limit maxfiles 1000000 1000000

Потім ви можете скористатися ulimit(але без цього sudo) для коригування ліміту процесу.

Якщо цього не зробити, можливо, у вашому ядрі можливі обмеження розміру. Якщо ваша модель підтримує її , завантаження ядра в 64-бітному режимі може допомогти.


1
sudo launchctl limit maxfiles 1000000 unlimitedНі жорсткий, ні м'який межа для "maxfiles" не можуть бути необмеженими. Будь-ласка, використовуйте числовий параметр для обох.
Томас Хантер

2
Будьте уважні, додаючи цей рядок до launchd.conf. Я думаю, якщо кількість занадто мала, це може зробити ваш комп'ютер непридатним. Наприклад, я використовував, limit maxfiles 1024 1024і мені було дуже важко змінити його назад.
Шон

1
На жаль: "Файл /etc/launchd.conf більше не консультується для підкоманд, які запускаються під час раннього завантаження; цю функціональність було видалено з міркувань безпеки."
Аліса Перселл

Не працює, мій номер fd не може перевищувати 6k, навіть якщо я встановив ulimit -Sn 10240 успішно.
Цзянь Вейханг

Номери fd @JianWeihang - це процес, тому я припускаю, що в інших процесах відкрито 4000 файлів. У вас трапляється запускати Chrome? ;)
Трейказ

41

Далі слід вирішити більшість рішень (і перераховані в порядку їх ієрархії):

echo 'kern.maxfiles=20480' | sudo tee -a /etc/sysctl.conf
echo -e 'limit maxfiles 8192 20480\nlimit maxproc 1000 2000' | sudo tee -a /etc/launchd.conf
echo 'ulimit -n 4096' | sudo tee -a /etc/profile

Примітки:

  1. Вам потрібно буде перезапустити, щоб ці зміни набули чинності.
  2. AFAIK ви більше не можете встановлювати обмеження на "необмежений" в ОС X
  3. maxctfile startctl обмежені maxfilesми sysctl, і тому їх не можна перевищувати
  4. Схоже, sysctl успадковує kern.maxfilesperproc від maxfiles startctl
  5. ulimit, схоже, успадковує це значення "відкритих файлів" від запуск за замовчуванням
  6. ви можете встановити користувацьку polimit в / etc / profile або ~ / .profile; хоча це не потрібно, я наводив приклад
  7. Будьте обережні, встановлюючи будь-яке з цих значень на дуже високе число в порівнянні з їх замовчуванням - функції існують стабільність / безпека. Я взяв ці приклади, які, на мою думку, є розумними, написані на інших веб-сайтах.

3
На жаль: "Файл /etc/launchd.conf більше не консультується для підкоманд, які запускаються під час раннього завантаження; цю функціональність було видалено з міркувань безпеки."
Аліса Перселл

34

Схоже, існує абсолютно інший метод зміни ліміту відкритих файлів для кожної версії OS X!

Для ОС X Sierra (10.12.X) потрібно:

1. Library/LaunchDaemonsСтворіть файл з іменем limit.maxfiles.plistта вставте наступне в (сміливо міняйте два числа (які відповідно є м'якими та жорсткими межами):

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"  
        "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">  
  <dict>
    <key>Label</key>
    <string>limit.maxfiles</string>
    <key>ProgramArguments</key>
    <array>
      <string>launchctl</string>
      <string>limit</string>
      <string>maxfiles</string>
      <string>64000</string>
      <string>524288</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>ServiceIPC</key>
    <false/>
  </dict>
</plist> 

2. Змініть власника нового файлу:

sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist

3. Завантажте ці нові налаштування:

sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist

4. Нарешті, перевірте правильність меж:

launchctl limit maxfiles

2
Ця відповідь чудова, і я знайшов тут щось, щоб додати її, @ninjaPixel: blog.dekstroza.io/ulimit-shenanigans-on-osx-el-capitan
Дін Редкліфф

20

Схоже, що OS X Lion не дозволить "необмежено" як значення:

% sudo launchctl limit maxfiles 8192 unlimited
Neither the hard nor soft limit for "maxfiles" can be unlimited. Please use a numeric parameter for both.

Надання числових значень як для м'якого, так і для жорсткого меж виконує цю роботу:

% sudo launchctl limit maxfiles 4096 8192

3
Якщо одне із значень було необмеженим , використовуючи -1як значення, приводить до 12288. Можна використовувати більші числові значення, наприклад sudo launchctl limit maxfiles 15000 150000. Я не впевнений, що ці параметри впливають тоді.
Даніель Бек

8

На Mavericks все просто. Як постійний користувач:

ulimit -n 8192

Ви можете перевірити оновлені настройки через

ulimit -a

На моїй машині:

ulimit -a
-t: cpu time (seconds)              unlimited
-f: file size (blocks)              unlimited
-d: data seg size (kbytes)          unlimited
-s: stack size (kbytes)             8192
-c: core file size (blocks)         0
-v: address space (kbytes)          unlimited
-l: locked-in-memory size (kbytes)  unlimited
-u: processes                       709
-n: file descriptors                8192

2
Подумайте про перегляд свого рішення. Ви встановлюєте обмеження 1024, а потім показуєте дескриптори вихідних файлів як 8192 (має бути 1024). Ви підхід також пробелматичний без судо, спробуйте змінити його кілька разів для себе.
y3sh

1
Судо не слід використовувати тут, але ця відповідь невірна. Користувачі Mavericks повинні використовувати, echo limit maxfiles 10000 10000|sudo tee -a /etc/launchd.confа потім перезапустити свою машину
Kyle Chadha

3

У ОС X 10.13.6 це працює для мене:

$ sysctl kern.maxfiles
kern.maxfiles: 12288
$ sysctl kern.maxfilesperproc
kern.maxfilesperproc: 10240
$ sudo sysctl -w kern.maxfiles=1048600
kern.maxfiles: 12288 -> 1048600
$ sudo sysctl -w kern.maxfilesperproc=1048576
kern.maxfilesperproc: 10240 -> 1048576
$ ulimit -S -n
256
$ ulimit -S -n 1048576
$ ulimit -S -n
1048576

1

Деякі межі не можуть бути змінені ulimit, оскільки вони застосовуються лише до поточної оболонки, тому launchctlкоманду слід використовувати для зміни обмежень глобально, наприклад

sudo launchctl limit maxfiles 100000 unlimited

Зауважте, що застосування цих обмежень у /etc/launchd.conf(як це пропонується в інших відповідях) більше не підтримується в останніх випусках macOS. Хоча все ще можна використовувати launchd.plist(див. man launchd.plist:) Такі plistфайли конфігурації для кожного користувача або загальносистемні файли, як запропоновано тут , там і там .


Щоб зробити ці обмеження стійкими, ви можете використовувати /etc/sysctl.confфайл та додати, наприклад:

kern.maxprocperuid=1000
kern.maxproc=2000
kern.maxfilesperproc=20000
kern.maxfiles=50000

Щоб зміни набули ефекту, потрібно перезавантажити.

Щоб переглянути поточні обмеження, запустіть: launchctl limitабо sysctl -a | grep ^kern.max.

Дивіться також: Як зберегти налаштування ulimit у macOS?

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