Как постоянно контролировать максимальное потребление системных ресурсов на Mac?

85

До Mavericks я мог использовать /etc/launchd.confфайл для изменения максимального потребления системных ресурсов, например:

limit maxfiles 16384 unlimited
limit maxproc 16384 unlimited

Это больше не работает в Маверикс.

Как правильно сделать это в последней версии OS X?

Говард
источник
Ваши предельные значения превышают максимальные для OS X. maxfiles завершается на уровне 10240, а максимальный предел составляет 1064. Если бы утвержденный ответ установил ограничения, я бы дал ему большой палец вверх ... но он оказался неправильным и не исправленным в течение хорошего года + сейчас ..
Джои Т
@atmosx: Должно быть /etc/sysctl.conf, нет /etc/sysctrl.conf.
Сиу Чинг Понг -Асука Кэндзи -
1
@JoeyT: На самом деле вы можете установить более высокий предел! Но вы должны сначала купить «OS X Server» в «App Store», если вы используете Mac OS X 10.8 (Mountain Lion) или 10.9 (Mavericks). (Да, вы должны заплатить 19,99 долларов США, чтобы изменить настройку!) Короче говоря, вам нужно запустить sudo serverinfo --setperfmode trueодин раз, чтобы перевести вашу машину в «Режим производительности сервера». Затем у вас есть «более высокий максимум», в зависимости от конфигурации вашего компьютера. Пожалуйста, см. Мой пост на Discussions.apple.com/thread/5166397 для деталей. Для 10.10 (Yosemite) режим включен по умолчанию (по крайней мере, на моей машине!). Смотрите мой ответ ниже.
Сиу Чинг Понг -Асука Кэндзи -

Ответы:

87

Предел сеанса оболочки

Ограничения, установленные через, ulimitвлияют только на процессы, созданные текущим сеансом оболочки.

  • «Мягкий предел» - это фактический предел, который используется. Его можно установить, если он не превышает «жесткого предела».
  • «Жесткий предел» также может быть установлен, но только на значение, меньшее, чем текущий, и только на значение, не меньшее, чем «мягкий предел».
  • «Жесткий предел», а также общесистемные ограничения могут быть повышены root(администратором) путем выполнения команд конфигурации системы или изменения файлов конфигурации системы.

После завершения сеанса оболочки (с помощью Ctrl+ D, exitили закрытия Terminal.appокна и т. Д.) Настройки исчезают. Если вы хотите использовать тот же параметр в следующем сеансе оболочки, добавьте этот параметр в сценарий запуска оболочки.

ПРИМЕЧАНИЕ: если вы используете bash, то это должно быть ~/.bash_proileили ~/.bash_login. Если вы используете другие оболочки, вероятно, так и должно быть ~/.profile.

Системный лимит (требуется перезагрузка для вступления в силу)

Для 10,9 (Маверикс), 10,10 (Йосемити), 10,11 (Эль-Капитан) и 10,12 (Сьерра):

Вы должны создать файл в /Library/LaunchDaemons/limit.maxfiles.plist(owner:, root:wheelmode:) 0644:

<?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>262144</string>
      <string>524288</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>ServiceIPC</key>
    <false/>
  </dict>
</plist>

Вы должны изменить номера в соответствии с вашими потребностями. Это «мягкий предел» ( 262144) и «жесткий предел» ( 524288) соответственно. Для получения дополнительной информации обратитесь к странице справки, запустив man launchd.plist.

Для 10,8 (Горный лев):

Вы можете добавить следующие строки в /etc/sysctl.conf(owner:, root:wheelmode:) 0644:

kern.maxfiles=524288
kern.maxfilesperproc=262144

Вы должны изменить номера в соответствии с вашими потребностями. Это «общесистемный лимит» ( kern.maxfiles) и «лимит на процесс» ( kern.maxfilesperproc) соответственно. Для получения дополнительных настроек обратитесь к странице справочника, запустив man sysctlили прочитав исходный код по адресу /usr/include/sys/sysctl.h.

Для более старых Mac OS X (я думаю, это работает на 10.7 (Lion) или раньше):

Вы можете добавить следующую строку в /etc/launchd.conf(owner:, root:wheelmode:) 0644:

limit maxfiles 262144 524288

Вы должны изменить номера в соответствии с вашими потребностями. Это «мягкий предел» ( 262144) и «жесткий предел» ( 524288) соответственно.

Если система не позволяет установить пределы выше определенного значения ...

Система не позволяет установить значение выше «жесткого максимума» (предложенного Apple). Чтобы увеличить этот «жесткий максимум», вы должны приобрести «OS X Server» в «App Store», а затем выполнить следующую команду один раз:

sudo serverinfo --setperfmode true

Это активирует «режим производительности сервера» на вашем компьютере. Затем вы можете установить максимум в соответствии с конфигурацией вашей машины (см. Это) . Я пробовал это раньше (на Горе и Маверикс), и это работает! Пожалуйста, смотрите мой пост ( здесь ) для получения дополнительной информации.

Рекомендации

Сиу Чинг Понг -Асука Кэндзи-
источник
1
Спасибо; Я использую Yosemite, а техника LaunchDaemon plist сработала для меня. Я верю, что это единственный, кто делает. Для тех, кому это необходимо, обратите внимание, что для вступления в силу требуется перезагрузка .
нк.
1
@nc. : Добавлено «Требуется перезагрузка для вступления в силу» в мой ответ. Я слишком долго работал в этой области, поэтому я не знал, что некоторые люди этого не знают. Спасибо за напоминание!
Сиу Чинг Понг-Асука Кэндзи -
2
Я использую 10.9.5, но только /etc/launchd.confподход показывает какой-либо эффект, когда я бегу ulimit -n. Может ли кто-нибудь обновить инструкции, если это важно?
Шридхар Сарнобат
1
Метод 10.10 Yosemite также работает в 10.11 El Capitan. Хотя я не мог установить его в «безлимитный», поэтому мне пришлось просто использовать действительно большое число
антривер
1
@aolszowka: посмотрите, как увеличить этот лимит с помощью /etc/sysctl.conf: superuser.com/questions/827984/…
Роб Йохансен,
11

Кажется, что создание файла /etc/launchd.confи помещение вашей команды внутри него должно помочь.


Если он не работает, вы, вероятно, можете отредактировать или создать /etc/rc.localфайл и добавить в него свою команду, поскольку маловероятно, что Apple когда-либо удалит поддержку ограничения в командной строке.


Редактировать 1 :
я должен начать с этого, справочная launchd страница ссылается на следующие файлы:

  ~/Library/LaunchAgents         Per-user agents provided by the user.
  /Library/LaunchAgents          Per-user agents provided by the administrator.
  /Library/LaunchDaemons         System-wide daemons provided by the administrator.
  /System/Library/LaunchAgents   Per-user agents provided by Mac OS X.
  /System/Library/LaunchDaemons  System-wide daemons provided by Mac OS X.

Я держу пари, что теперь вам нужно ввести свою команду либо в, ~/Library/LaunchAgentsлибо в /Library/LaunchDaemons.
Вы должны попробовать оба.

Редактировать 2 :
Также имейте в виду, что для launchd нужен файл XML, а не только скрипты. Gui был призван помочь в такой задаче, а несвободным является Lingon . Возможно, существуют другие бесплатные продукты.

Kiwy
источник
поскольку в моем сообщении много информации, можете ли вы сказать, какая из них была хорошей?
Kiwy
см. мой ответ ниже.
Говард
Оба /etc/launchd.confи /etc/rc.localигнорируются в 10.10 и позже, так как в 10.10 launchd был переработан, а SystemStarter был удален.
Нисетама
@nise, не стесняйтесь обновлять мой ответ, если что-то новое появилось в последней версии Mac OS
Kiwy
10

Я просто добавил эти две строки в мои .bash_profile
работы, как шарм

ulimit -n 1024
ulimit -u 1024
pixelass
источник
2
Не влияет на системные ограничения.
not2savvy
1
Тем не менее, это может быть хорошо, если ваши системные ограничения достаточно высоки. Чтобы проверить, что они, вы можете просто запустить ulimit -n -H. На macOS High Sierra это unlimitedтак меняло «мягкий» лимит пользователя в своем .bash_profileделе.
Джошуа Пинтер
9

Системные ограничения

Изменение ограничений /etc/launchd.confили /etc/rc.localбольше не поддерживается для последних macOS. См .: Старые системы и технологии .

Вместо этого вы должны создать новый агент запуска .

Вот пример команды с использованием PlistBuddyкоманды (см . man PlistBuddy:):

sudo /usr/libexec/PlistBuddy /Library/LaunchAgents/com.launchd.maxfiles.plist \
-c "add Label string com.launchd.maxfiles" \
-c "add ProgramArguments array" \
-c "add ProgramArguments: string launchctl" \
-c "add ProgramArguments: string limit" \
-c "add ProgramArguments: string maxfiles" \
-c "add ProgramArguments: string 10240" \
-c "add ProgramArguments: string unlimited" \
-c "add RunAtLoad bool true"

И похоже на maxprocлимит:

sudo /usr/libexec/PlistBuddy /Library/LaunchAgents/com.launchd.maxproc.plist \
-c "add Label string com.launchd.maxproc" \
-c "add ProgramArguments array" \
-c "add ProgramArguments: string launchctl" \
-c "add ProgramArguments: string limit" \
-c "add ProgramArguments: string maxproc" \
-c "add ProgramArguments: string 2000" \
-c "add ProgramArguments: string unlimited" \
-c "add RunAtLoad bool true"

Для загрузки файлов выше, запустите: sudo launchctl load /Library/LaunchAgents/com.launchd.*.plist.

Примечания:

  • Чтобы распечатать файл, запустите: catили PlistBuddy -x -c Print /Library/LaunchAgents/com.launchd.maxfiles.plist.
  • Чтобы проверить журнал на наличие ошибок во время загрузки, выполните команду: tail -f /var/log/system.log.
  • Чтобы увидеть текущие launchdограничения, выполните команду: launchctl limit.
  • .plistФайл может быть помещен в каждом пользователь или папку агента общесистемного ( LaunchAgents). Смотрите: man launchdи / man launchd.plistили тот или иной ответ для более подробной информации.

Пределы ядра

Обратите внимание, что вышеуказанные системные ограничения Launchd по-прежнему ограничены ядром, поэтому вы не можете установить их выше, чем фактические ограничения, установленные в переменных состояния ядра (см. man sysctlСправку).

Чтобы увидеть текущие ограничения ядра, выполните команду: sysctl -a | grep ^kern.max.

Для увеличения maxfilesлимита, выполните команду: sudo sysctl -w kern.maxfiles=20480.

Чтобы они сохранялись, используйте аналогичный метод для создания .plistфайлов запуска , например

sudo /usr/libexec/PlistBuddy /Library/LaunchAgents/com.kern.maxfiles.plist \
-c "add Label string com.kern.maxfiles" \
-c "add ProgramArguments array" \
-c "add ProgramArguments: string sysctl" \
-c "add ProgramArguments: string -w" \
-c "add ProgramArguments: string kern.maxfiles=20480" \
-c "add RunAtLoad bool true"

Ограничения оболочки

Для ограничений оболочки добавьте соответствующую ulimitкоманду ~/.bashrcили ~/.bash_profileфайл запуска для отдельного пользователя или /etc/bashrcдля всех пользователей. Смотрите: Как добавить постоянные параметры оболочки ulimit на Mac?

Предлагаемые строки для добавления:

# Changes the ulimit limits.
ulimit -Sn 4096      # Increase open files.
ulimit -Sl unlimited # Increase max locked memory.
kenorb
источник
1
Будьте особенно осторожны с этим, maxprocпотому что по умолчанию ограничение жесткого ядра для этого параметра равно 1064, что означает, что для него установлено значение 2000 или «без ограничений», на самом деле устанавливается только значение 1064. К сожалению, ядро ​​не применяет это maxprocperuid < maxproc, и предлагаемые вами настройки оставят Система с maxprocperuid=2000и maxproc=1064которая опасна. Подробнее об этом читайте здесь .
Старый Про
0

Если у вас есть одна программа, в которой выполняется поиск ulimit(мягкое ограничение на количество файлов, которое может открыть один процесс), подгонка ulimitк большему числу вполне подойдет, особенно если вы можете просто вставить ulimitкоманду в свой файл .bash_profile. Кроме того, я настоятельно советую против редактирования файлов , такой как /etc/launchd.confили /etc/sysctl.confили добавление Plist файлов в /Library/LaunchDaemons/течение нескольких причин.

  • Изменения в этих файлах сохраняются в резервных копиях и переносятся в новые версии macOS и новые компьютеры при обновлении.

  • Если эти изменения вызывают проблемы (что является реальной возможностью), вы должны помнить, что вы внесли изменения и что это за изменения, а затем повторно отредактировать файлы, чтобы отменить их. Это может случиться годами позже.

  • После нескольких лет обновления вы можете обнаружить, что то, что раньше было увеличением лимита, теперь является уменьшением лимита. Но вы, вероятно, не будете знать об этом, потому что вы (а) не будете помнить, что вы внесли изменение, и (б) не сможете увидеть новые ограничения, потому что вы отменили их с самого начала.

Гораздо лучший вариант

В общем, вместо того, чтобы настраивать отдельные параметры в системе и выводить систему из равновесия (и, возможно, позволить одной программе привести к сбою системы, забирая все ресурсы), если системные ограничения по умолчанию недостаточны для ваших нужд, я рекомендую ture на «Режим производительности сервера», или, по крайней мере, дать ему попробовать. Все, что вам для этого нужно - это OS X / macOS 10.8 Mountain Lion или более поздней версии и минимум 16 ГБ установленной памяти. Раньше вам приходилось платить за это, но начиная с OS X 10.8 Mountain Lion, она бесплатна и официально поддерживается Apple со стандартной ОС.

Включение этого режима значительно увеличивает системные ограничения, особенно количество процессов, которые вы можете запустить, и количество файлов, которые вы можете открыть, за счет выделения большего количества памяти системному ядру. Вы можете подробно прочитать, что меняется в зависимости от режима работы сервера, в ответе на вопрос «Что на самом деле serverperfmode = 1 делает в macOS?» ,

Этот режим имеет несколько преимуществ по сравнению с редактированием файлов конфигурации, о чем свидетельствуют другие ответы.

  • Это изменение одного параметра, который легко отменить.
  • Это приводит к сбалансированному набору более высоких пределов, сохраняя гарантии от мошеннических процессов, приводящих к сбою системы.
  • В большинстве случаев он предоставляет более высокие ограничения, чем было бы разрешено ядром, даже при редактировании файлов конфигурации.
  • Это повышает ограничения по умолчанию для всех процессов без каких-либо дополнительных изменений конфигурации.
  • Начиная с OS X 10.11 El Capitan, изменение конфигурации сохраняется в NVRAM, что означает, что, если это вызывает проблемы, вы вернетесь в обычный режим, когда будете предпринимать шаги по устранению неполадок сброса NVRAM. Вы не должны помнить это.
  • Поскольку он находится в NVRAM, он не будет случайно изменять состояние при восстановлении из резервных копий.
  • Поскольку он находится в NVRAM, он не включится автоматически при клонировании настроек Mac на новое оборудование.
  • Поскольку он официально поддерживается Apple, «он просто работает», и вы не будете получать жалобы от Apple Geniuses, что вы неправильно модифицировали систему при обращении за поддержкой.
  • Поскольку это изменение одного параметра, вы можете легко включать и выключать его для устранения неполадок или сравнения одного параметра с другим.

Включить или выключить режим производительности сервера

Чтобы включить режим производительности сервера, используйте терминал для запуска одной из следующих команд, а затем перезагрузите компьютер, чтобы он вступил в силу:

  • Для OS X 10.11 El Capitan или более поздней версии включите его с помощью
sudo nvram boot-args="serverperfmode=1 $(nvram boot-args 2>/dev/null | cut -f 2-)"

и выключите его

sudo nvram boot-args="$(nvram boot-args 2>/dev/null | sed -e $'s/boot-args\t//;s/serverperfmode=1//')"

Вышеуказанные команды - это то, что Apple официально рекомендует, но на самом деле с ними есть проблема, заключающаяся в том, что если вы дважды запустите команду «включить», то вам придется дважды запустить команду «выключить», чтобы отключить ее. Поэтому проверьте, включен ли он или нет после внесения изменений, запустив

nvram boot-args

Если вывод содержит «serverperfmode = 1», то настройка включена, а если нет, то настройка выключена.

  • Для OS X 10.8 Mountain Lion, OS X 10.9 Mavericks и OS X 10.10 Yosemite включите режим производительности сервера с помощью
serverinfo --setperfmode 1

и выключите его

serverinfo --setperfmode 0

Проверьте настройку с помощью

serverinfo --perfmode

Настройка не вступит в силу до перезагрузки системы.

Проверка того, работает ли компьютер в режиме производительности сервера

Проверка настройки покажет вам, будет ли она вступать в силу (или нет) после перезагрузки. Чтобы проверить, активен ли он в данный момент (при условии, что вы следовали моему совету и не редактировали файлы конфигурации, которые меняют настройки), запустите

sysctl kern.maxproc

Это даст вам число, которое является максимальным количеством процессов, которые разрешит система. Если это число кратно 532 , режим производительности сервера отключен. Если это округленное число (кратное 2500), то для работающей в данный момент системы включен режим производительности сервера.

Old Pro
источник