Aumentar o número máximo de descritores de arquivos abertos no Snow Leopard?

101

Estou tentando fazer algo que requer um grande número de descritores de arquivo

sudo ulimit -n 12288é tão alto quanto o Snow Leopard quer ir; além disso resulta em

/ usr / bin / ulimit: linha 4: ulimit: arquivos abertos: não é possível modificar o limite: argumento inválido.

Quero aumentar o número muito mais, digamos 100000. É possível?

Chris Poole
fonte
4
As respostas desta pergunta não funcionam mais no OSX Mavericks.
Howard
2
Executar echo limit maxfiles 10000 10000|sudo tee -a /etc/launchd.confe reiniciar funciona para mim no Mavericks.
Lri 30/05

Respostas:

95

Usar ulimitcomando altera apenas os limites de recursos do shell atual e de seus filhos e sudo ulimitcria um shell raiz, ajusta seus limites e depois sai (não tendo, até onde eu possa ver, efeito real).
Para exceder 12288, você precisa ajustar o kernel kern.maxfilese os kern.maxfilesperprocparâmetros e também (pelo menos de acordo com esta entrada do blog , que é um resumo desta discussão ) um limite de inicialização. Você pode usar launchctl limitpara ajustar tudo isso de uma vez:

sudo launchctl limit maxfiles 1000000 1000000

Para tornar isso permanente (ou seja, não redefinir quando você reinicia), crie /etc/launchd.confcontendo:

limit maxfiles 1000000 1000000

Em seguida, você pode usar ulimit(mas sem o sudo) para ajustar seu limite de processo.

Se isso não acontecer, você pode estar executando limites de tamanho no kernel. Se o seu modelo suportar , a inicialização do kernel no modo de 64 bits pode ajudar.

Gordon Davisson
fonte
1
sudo launchctl limit maxfiles 1000000 unlimitedNem o limite rígido nem flexível para "maxfiles" pode ser ilimitado. Por favor, use um parâmetro numérico para ambos.
Thomas Hunter
2
Tenha cuidado ao adicionar essa linha a launchd.conf. Acho que se o número for muito pequeno, ele poderá inutilizar o computador. Por exemplo, eu usei limit maxfiles 1024 1024e tive muita dificuldade para mudar de volta.
Shawn
1
Alas: "O arquivo /etc/launchd.conf não é mais consultado para que os subcomandos sejam executados durante o período inicial de inicialização; essa funcionalidade foi removida por questões de segurança."
Alice Purcell
Ele não funciona, meu número fd não pode exceder 6k, mesmo se eu definir o ulimit -Sn 10240 com êxito.
Jian Weihang
@JianWeihang os números fd são por processo, por isso suponho que outros processos tenham 4000 arquivos abertos. Você usa o Chrome? ;)
Trejkaz
41

O seguinte deve resolver a maioria das soluções (e são listadas na ordem de sua hierarquia):

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

Notas:

  1. Você precisará reiniciar para que essas alterações entrem em vigor.
  2. AFAIK, você não pode mais definir limites para 'ilimitado' no OS X
  3. launchctl maxfiles são limitados por sysctl maxfiles e, portanto, não podem excedê-los
  4. O sysctl parece herdar o kern.maxfilesperproc do launchctl maxfiles
  5. ulimit parece herdar o valor de 'arquivos abertos' do launchctl por padrão
  6. você pode definir um ulimit personalizado dentro de / etc / profile ou ~ / .profile; Embora isso não seja necessário, forneci um exemplo
  7. Seja cauteloso ao definir um desses valores para um número muito alto quando comparado com o padrão - os recursos existem estabilidade / segurança. Peguei esses números de exemplo que considero razoáveis, escritos em outros sites.
errant.info
fonte
3
Alas: "O arquivo /etc/launchd.conf não é mais consultado para que os subcomandos sejam executados durante o período inicial de inicialização; essa funcionalidade foi removida por questões de segurança."
Alice Purcell
34

Parece que existe um método totalmente diferente para alterar o limite de arquivos abertos para cada versão do OS X!

Para o OS X Sierra (10.12.X), você precisa:

1. Library/LaunchDaemonsCrie um arquivo nomeado limit.maxfiles.pliste cole o seguinte em (fique à vontade para alterar os dois números (que são os limites flexíveis e flexíveis, respectivamente):

<?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. Altere o proprietário do seu novo arquivo:

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

3. Carregue estas novas configurações:

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

4. Por fim, verifique se os limites estão corretos:

launchctl limit maxfiles
ninjaPixel
fonte
2
Essa resposta é grande, e eu achei algumas informações a acrescentar aqui, @ninjaPixel: blog.dekstroza.io/ulimit-shenanigans-on-osx-el-capitan
Dean Radcliffe
20

Parece que o OS X Lion não permitirá "ilimitado" como um valor:

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

Fornecer valores numéricos para o limite flexível e flexível faz o trabalho:

% sudo launchctl limit maxfiles 4096 8192
crishoj
fonte
3
Se um dos valores for ilimitado , usar -1como valor resulta em 12288. É possível usar valores numéricos maiores, por exemplo sudo launchctl limit maxfiles 15000 150000. Não tenho certeza se essas configurações têm efeito, então.
Daniel Beck
8

No Mavericks é simples. Como usuário regular:

ulimit -n 8192

Você pode verificar as configurações atualizadas via

ulimit -a

Na minha máquina:

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
Clustermagnet
fonte
2
Considere revisar sua solução. Você está configurando um limite máximo de 1024 e, em seguida, mostrando os descritores do arquivo de saída como 8192 (deve ser 1024). Sua abordagem também é probelmatic sem sudo, tente alterá-lo algumas vezes para si mesmo.
y3sh
1
O sudo não deve ser usado aqui, mas esta resposta está incorreta. Usuários Mavericks deve usar echo limit maxfiles 10000 10000|sudo tee -a /etc/launchd.confe reinicie sua máquina
Kyle Chadha
3

No OS X 10.13.6, isso funciona para mim:

$ 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
Petr Javorik
fonte
1

Alguns limites não podem ser alterados ulimit, porque se aplicam apenas ao shell atual; portanto, o launchctlcomando deve ser usado para alterar os limites globalmente, por exemplo

sudo launchctl limit maxfiles 100000 unlimited

Observe que a aplicação desses limites no /etc/launchd.conf(como sugerido em outras respostas) não é mais suportada nas versões recentes do macOS. Embora ainda possa usar launchd.plist(consulte :), como arquivos de configuração man launchd.plistpor usuário ou em todo o sistema, plistconforme sugerido aqui , ali e ali .


Para tornar esses limites persistentes, você pode usar o /etc/sysctl.confarquivo e adicionar, por exemplo:

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

Para que as alterações tenham efeito, é necessário reiniciar.

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

Consulte também: Como manter as configurações de ulimit no macOS?

kenorb
fonte