Questão Existe uma correção para o erro "Há muitos arquivos abertos no sistema" no OS X 10.7.1?


Eu preciso me livrar do limite "Too many open files in system" no OS X 10.7.1.

Há algum caminho?


150


origem


Você quer explicar mais sobre quando isso acontece? Em quais circunstâncias? - slhck
@slhck - Eu tenho o mesmo problema. As circunstâncias são basicamente "aleatórias". Eu sou um desenvolvedor, então estou usando meu Mac bastante: executando um ou mais bancos de dados, um servidor web, ferramentas de teste, um ou mais navegadores e um reprodutor de música de uma só vez. O Google Chrome parece ser um programa com muitos arquivos abertos. - Nathan Long
Na verdade, meu "uso pesado" não era o problema; minhas configurações para o número máximo de arquivos abertos para o kernal e por processo eram muito menores do que os padrões deveriam ser. - Nathan Long
Se você leu o comentário de Nathan e se perguntou por que ele não incluiu nenhum detalhe sobre os padrões, é porque ele soletrou tudo em sua resposta, abaixo. (Boa resposta! :) - Olie
Eu estou na mesma circunstância de uso como Nathan Long, e encontrei reiniciar o Apache foi o único passo que "resolveu" o problema. Apliquei todos os aumentos de limite abaixo, mas eles não ajudaram imediatamente. Estou executando a linha de comando testes phpUnit> selenium server> firefox> apache> php> mysql todos no mesmo macbook. Usado para funcionar bem até que eu atualizei para mavericks. O erro que recebo está no webapp que está sendo testado, ou seja, o php / apache está ficando sem arquivos, então presumivelmente não é controlado pela configuração do shell. - scipilot


Respostas:


De acordo com este artigo útil (que eu recomendo a leitura):

Por padrão, o número máximo de arquivos que o Mac OS X pode abrir está definido   para 12.288 e o número máximo de arquivos que um determinado processo pode abrir é   10,240.

Você pode verificar isso com:

  • sysctl kern.maxfiles
  • sysctl kern.maxfilesperproc

Você pode aumentar os limites (por sua conta e risco) com:

  • sysctl -w kern.maxfiles=20480 (ou o número que você escolher)
  • sysctl -w kern.maxfilesperproc=18000 (ou o número que você escolher)

Para tornar a mudança permanente, use sudo para colocar suas configurações em /etc/sysctl.conf (que você pode ter que criar), assim:

kern.maxfiles=20480
kern.maxfilesperproc=18000

Nota: no OS X 10.10 ou inferior, você pode adicionar a configuração /etc/launchd.conf gostar limit maxfiles e isso substituirá tudo o que você colocar aqui.

Mais uma vez, do artigo:

Depois de fazer isso, o próprio kernel terá um número máximo de   arquivos, mas o shell não pode. E como a maioria dos processos que serão executados   até isso muitos arquivos vão ser iniciados pelo shell você está   vai querer aumentar isso.

O comando para isso é:

ulimit -S -n 2048 # or whatever number you choose

Essa mudança também é temporária; dura apenas a sessão atual do shell. Você pode adicioná-lo ao seu arquivo de configuração do shell (.bashrc, .zshrc ou qualquer outra coisa) se você quiser que ele seja executado toda vez que você abrir um shell.


198



qual limite se aplica a processos iniciados clicando em ícones na área de lançamento? E como mudar esse limite? Quando você diz "shell", estou assumindo que você quer dizer um shell de terminal interativo. - Cheeso
@Cheeso - eu pensar que o limite geral do sistema (sysctl) ou o limite de inicialização, o que for menor, controla isso. - Nathan Long
criar um /etc/launchd.conf com limite de conteúdo maxfiles 1000000 1000000 funcionou muito bem para mim! (OSX 10.8.2 aqui) - Zugwalt
Eu coloco kern.maxfiles=65000 kern.maxfilesperproc=65000 em /etc/sysctl.conf e reiniciado. kern.maxfiles foi ignorado e ficou o padrão, mas o kern.maxfilesperproc foi configurado para 65000. Eu não tenho o /etc/launchd.conf, então o que há com isso? - pferrel
Se alguém tiver problemas com arquivos max não aderentes, é porque há um espaço à direita depois da linha maxfiles, que precisa ser excluída. - jjathman


Parece que existe um método completamente 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 Crie um arquivo em /Library/LaunchDaemons/limit.maxfiles.plist e cole o seguinte em (sinta-se livre para alterar os dois números (que são os limites flexíveis e rígidos, 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

51



funcionou perfeitamente, obrigado! No meu caso, o erro manifestado em um processo java com a mensagem IO Error: Bad file descriptor (Write failed) - agradl
Também trabalha em El Capitan 10.11.6 - Troy Daniels
ainda não é possível alterar o ulimit para shell. O máximo fica 1024 o que eu faço - DataGreed
Na etapa 2, execute: sudo chmod 600 /Library/LaunchDaemons/limit.maxfiles.plist sudo chown root /Library/LaunchDaemons/limit.maxfiles.plist - Hai Nguyen


Você precisará aumentar suas configurações de ulimit - é muito baixo no OS X atualmente - 256 por padrão. Adicionar ulimit -n 4096 ou similar ao seu ~ / .profile ou equivalente e que irá resolvê-lo em seu ambiente local. Corre ulimit -a para verificar seus níveis atuais

Para ver as configurações do sistema, execute isto:

launchctl limit maxfiles

É um pouco mais alto no Leão (10240) em uma base por processo do que costumava ser. Mas se você ainda estiver batendo lá, então você pode configurá-lo mais alto usando o mesmo comando com os níveis desejados. Para tornar as mudanças permanentes, o /etc/launchd.conf é onde você precisa adicionar as linhas relevantes.


29



256? São 2560 descritores de arquivos para mim e eu nunca mudei. O limite é de 266 processos (c.f. ulimit -a). - slhck
O mesmo para mim, 256 arquivos no MacOS X Maverick - Climbatize
256 no OS X Yosemite também - Alexander
256 no El Capitan também. - TMN
256 em Yosemite. - Jaec


Outra opção pode ser encontrar o culpado:

sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail

Para o último, você pode ver quais arquivos estão abertos:

sudo lsof -n | grep socketfil

E mate o processo se assim o desejar

kill $pid

Dos comentários:

Por que vale a pena, você também pode obter uma lista dos IDs de processo com os arquivos mais abertos usando

lsof -n | sed -E 's/^[^ ]+[ ]+([^ ]+).*$/\1/' | uniq -c | sort | tail

17



Útil! Mas classificar no OS X (10.11) não leva -h. (Talvez -g?) - Robert Calhoun
Para mim funcionou bem só sem -h (OS X 10.12.3): sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail - vearutop
Assim seja sem -h - sanmai
Esta é a única resposta que me ajudou a raiz causa o meu problema .. obrigado :) - SgtPooki
Por que vale a pena, você também pode obter uma lista dos IDs de processo com os arquivos mais abertos usando lsof -n | sed -E 's/^[^ ]+[ ]+([^ ]+).*$/\1/' | uniq -c | sort | tail. - Chris Frederick


Gente, no Mavericks 10.9.4

ulimit -n 2048 funciona bem. Você pode precisar iniciar uma nova sessão de login.


9





Eu a encontrei enquanto fazia um chmod -R, então eu fiz isso dando pequenos passos, por exemplo,

# for each directory
find . -type d -exec chmod 755 {} \;

0



Embora isso possa ser uma solução, não parece responder à pergunta. Talvez explicar que você não pode se livrar da mensagem e, em seguida, propor isso como uma maneira de torná-la menos problemática melhoraria sua resposta. - music2myear


Você pode correr

lsof -n

qual processo abre muitos arquivos.

então mate-o.

ou

sysctl -w kern.maxfiles=20480

mude para um maior.


0



Por favor, explique como esta resposta difere das que já foram dadas. - Stephen Rauch