Como controlar persistentemente o consumo máximo de recursos do sistema no Mac?

85

Antes do Mavericks, eu poderia usar o /etc/launchd.confarquivo para alterar o consumo máximo de recursos do sistema, por exemplo:

limit maxfiles 16384 unlimited
limit maxproc 16384 unlimited

Já não funciona no Mavericks.

Qual é a maneira correta de fazer isso na versão recente do OS X?

Howard
fonte
Seus limites estão acima do máximo para o OS X. maxfiles termina em 10240 e o limite maxproc é 1064. Se a resposta aprovada fixasse os limites, eu daria um joinha .. mas ele está parado lá errado e sem correção por um bom ano + agora ..
Joey T
@atmosx: Deveria ser /etc/sysctl.conf, não /etc/sysctrl.conf.
Siu Ching Pong -Asuka Kenji-
11
@ JoeyT: Na verdade, você pode configurá-lo para um limite mais alto! Mas você precisa comprar o "OS X Server" na "App Store" primeiro se estiver no Mac OS X 10.8 (Mountain Lion) ou 10.9 (Mavericks). (Sim, você precisa pagar US $ 19,99 para alterar uma configuração!) Em resumo, é necessário executar sudo serverinfo --setperfmode trueuma vez para colocar sua máquina no "Modo de desempenho do servidor". Então, você tem um "máximo máximo", dependendo da configuração da sua máquina. Por favor, veja o meu post em discussions.apple.com/thread/5166397 para obter detalhes. Para 10.10 (Yosemite), o modo está ativado por padrão (pelo menos na minha máquina!). Veja minha resposta abaixo.
Siu Ching Pong -Asuka Kenji-

Respostas:

87

Limite de sessão do shell

Os limites definidos via ulimitafetam apenas os processos criados pela sessão atual do shell.

  • O "limite flexível" é o limite real usado. Pode ser definido, desde que não seja maior que o "limite máximo".
  • O "limite máximo" também pode ser definido, mas apenas para um valor menor que o atual e apenas para um valor não menor que o "limite flexível".
  • O "limite rígido", assim como os limites de todo o sistema, pode ser aumentado pelo root(administrador) executando comandos de configuração do sistema ou modificando os arquivos de configuração do sistema.

Depois que você encerra a sessão do shell (por Ctrl+ D, exitou fecha a Terminal.appjanela etc.), as configurações desaparecem. Se você deseja a mesma configuração na próxima sessão do shell, adicione a configuração ao script de inicialização do shell.

NOTA: Se você estiver usando bash, deve ser ~/.bash_proileou ~/.bash_login. Se você estiver usando outras conchas, provavelmente deve estar ~/.profile.

Limite do sistema (requer reinicialização para entrar em vigor)

Para 10.9 (Mavericks), 10.10 (Yosemite), 10.11 (El Capitan) e 10.12 (Sierra):

Você precisa criar um arquivo em /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>

Você deve alterar os números de acordo com suas necessidades. Eles são o "limite flexível" ( 262144) e o "limite rígido" ( 524288), respectivamente. Para mais informações, consulte a página do manual executando man launchd.plist.

Para 10.8 (leão da montanha):

Você pode adicionar as seguintes linhas em /etc/sysctl.conf(proprietário:, root:wheelmodo 0644:):

kern.maxfiles=524288
kern.maxfilesperproc=262144

Você deve alterar os números de acordo com suas necessidades. Eles são o "limite de todo o sistema" ( kern.maxfiles) e o "limite por processo" ( kern.maxfilesperproc), respectivamente. Para obter mais configurações, consulte a página do manual executando man sysctlou leia o código fonte em /usr/include/sys/sysctl.h.

Para Mac OS X mais antigo (acho que funciona com 10.7 (Lion) ou antes):

Você pode adicionar a seguinte linha a /etc/launchd.conf(proprietário:, root:wheelmodo 0644:):

limit maxfiles 262144 524288

Você deve alterar os números de acordo com suas necessidades. Eles são o "limite flexível" ( 262144) e o "limite rígido" ( 524288), respectivamente.

Se o sistema não permitir que você defina os limites acima de um determinado valor ...

O sistema não permite que você defina um valor maior que um "máximo máximo" (proposto pela Apple). Para aumentar esse "máximo máximo", você deve adquirir o "OS X Server" na "App Store" e executar o seguinte comando uma vez:

sudo serverinfo --setperfmode true

Isso ativa o "modo de desempenho do servidor" em sua máquina. Você pode então definir o máximo de acordo com a configuração da sua máquina (consulte isto) . Eu tentei isso antes (em Mountain e Mavericks) e funciona! Por favor, veja o meu post ( aqui ) para mais informações.

Referências

Siu Ching Pong - Asuka Kenji-
fonte
11
Obrigado; Estou usando o Yosemite e a técnica de lançamento do LaunchDaemon funcionou para mim. Eu acredito que é o único que faz. Para quem precisa disso, observe que é necessária uma reinicialização para que ela entre em vigor .
nc.
11
@nc. : Adicionado "Exigir que a reinicialização entre em vigor" à minha resposta. Eu trabalho muito tempo no campo, então não sabia que algumas pessoas não sabem disso. Obrigado por lembrar!
você precisa saber é o seguinte
2
Estou usando o 10.9.5, mas apenas a /etc/launchd.confabordagem mostra algum efeito quando executo ulimit -n. Alguém poderia atualizar as instruções se isso for significativo?
Sridhar Sarnobat
11
O método 10.10 Yosemite também funciona em 10.11 El Capitan. Embora eu não pudesse defini-lo como "ilimitado" então eu tive que usar apenas um número elevado
antriver
11
@aolszowka: veja isso para saber como aumentar esse limite via /etc/sysctl.conf: superuser.com/questions/827984/…
Rob Johansen
11

Parece que a criação do arquivo /etc/launchd.confe a colocação do seu comando nele devem funcionar.


Se não funcionar, você provavelmente poderá editar ou criar o /etc/rc.localarquivo e adicionar seu comando, pois há poucas chances de a Apple excluir o suporte ao limite na linha de comando.


Edit 1 :
Eu deveria começar com isso, a launchd página de manual faz referência aos seguintes arquivos:

  ~/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.

Minha aposta é que agora você precisa colocar seu comando dentro ~/Library/LaunchAgentsou dentro /Library/LaunchDaemons.
Você deveria tentar os dois.

Editar 2 :
saiba também que o launchd precisa de um arquivo xml e não apenas de scripts. um gui foi designado para ajudar nessa tarefa e um não livre é o Lingon . Talvez existam outros produtos gratuitos.

Kiwy
fonte
como há muitas informações no meu post, você pode dizer qual foi a boa?
Kiwy
veja minha resposta abaixo.
274 Howard
Ambos /etc/launchd.confe /etc/rc.localsão ignorados na 10.10 e posterior, pois na 10.10 o launchd foi reprojetado e o SystemStarter foi removido.
Nisetama
@nise à vontade para atualizar meu answe'r se algo de novo surgiu em versão recente do Mac OS
kiwy
10

Acabei de adicionar essas duas linhas nos meus .bash_profile
trabalhos como um encanto

ulimit -n 1024
ulimit -u 1024
pixelass
fonte
2
Não influencia os limites do sistema.
not2savvy
11
No entanto, isso pode ser bom se os limites do sistema forem altos o suficiente. Para verificar o que são, você pode simplesmente correr ulimit -n -H. No macOS High Sierra, unlimitedalterava tanto o limite "flexível" do usuário quanto .bash_profileo truque.
Joshua Pinter
9

Limites do sistema

Alterar os limites /etc/launchd.confou /etc/rc.localnão é mais compatível com o macOS recente. Veja: Sistemas e Tecnologia Antigos .

Em vez disso, você deve criar um novo agente de inicialização .

Aqui está o exemplo de PlistBuddycomando usando o comando (consulte 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"

E semelhante para o maxproclimite:

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"

Para carregar arquivos acima, execute: sudo launchctl load /Library/LaunchAgents/com.launchd.*.plist.

Notas:

  • Para imprimir o arquivo, execute: catou PlistBuddy -x -c Print /Library/LaunchAgents/com.launchd.maxfiles.plist.
  • Para verificar o log por quaisquer erros durante a carga, execute: tail -f /var/log/system.log.
  • Para ver os atuais launchdlimites, execute: launchctl limit.
  • O .plistarquivo pode ser colocado na pasta por usuário ou em todo o sistema ( LaunchAgents). Veja: man launchde man launchd.plist, ou esta ou aquela resposta para mais detalhes.

Limites do kernel

Observe que os limites do sistema Launchd acima ainda são limitados pelo kernel, portanto você não pode defini-los acima dos limites reais definidos nas variáveis ​​de estado do kernel (consulte: man sysctlpara obter ajuda).

Para ver os limites atuais do kernel, execute: sysctl -a | grep ^kern.max.

Para aumentar o maxfileslimite, execute: sudo sysctl -w kern.maxfiles=20480.

Para fazê-los persistir, use o método semelhante para criar .plistarquivos de inicialização , por exemplo

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"

Limites de Shell

Para limites de shell, adicione ulimitcomando relevante ~/.bashrcou ~/.bash_profilearquivo de inicialização para usuário individual ou /etc/bashrcpara todos os usuários. Consulte: Como adicionar configurações de ulimit de shell persistente no Mac?

Linhas sugeridas para adicionar:

# Changes the ulimit limits.
ulimit -Sn 4096      # Increase open files.
ulimit -Sl unlimited # Increase max locked memory.
kenorb
fonte
11
Seja particularmente cuidadoso maxprocporque, por padrão, o limite do kernel rígido nesse parâmetro é 1064, ou seja, defini-lo como 2000 ou "ilimitado" na verdade apenas o define 1064. Infelizmente, o kernel não impõe isso maxprocperuid < maxproc, e as configurações sugeridas deixarão o sistema com maxprocperuid=2000e maxproc=1064que é perigoso. Leia mais sobre isso aqui .
Old Pro