Existe uma correção para o erro "Muitos arquivos abertos no sistema" no OS X 10.7.1?

191

Preciso me livrar do irritante limite "Muitos arquivos abertos no sistema" no OS X 10.7.1. 

Há algum caminho?

John Wilund
fonte
4
Deseja explicar mais sobre quando isso acontece? Em que circunstâncias?
slhck
11
@ Sllck - Eu tenho o mesmo problema. As circunstâncias são basicamente "aleatórias". Sou desenvolvedor, por isso estou usando bastante o meu Mac: executando um ou mais bancos de dados, um servidor web, ferramentas de teste, um ou mais navegadores e um reprodutor de música ao mesmo tempo. O Google Chrome parece ser um programa que possui 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 deveriam ser os padrões.
Nathan Long
2
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 explicou tudo em sua resposta abaixo. (Resposta de Nice :)!
Olie
Estou na mesma circunstância de uso de Nathan Long e achei que reiniciar o Apache foi o único passo que "resolveu" o problema. Eu apliquei todos os aumentos de limite abaixo, mas eles não ajudaram imediatamente. Estou executando testes de linha de comando phpUnit> servidor selenium> firefox> apache> php> mysql, todos no mesmo macbook. Costumava funcionar bem até que eu atualizei para Mavericks. O erro que recebo está no webapp que está sendo testado, ou seja, é php / apache ficando sem arquivos, então presumivelmente não é controlado pela configuração do shell.
scipilot

Respostas:

225

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 é definido como 12.288 e o número máximo de arquivos que um determinado processo pode abrir é 10.240.

Você pode verificar estes com:

  • sysctl kern.maxfiles
  • sysctl kern.maxfilesperproc

Você pode aumentar os limites (por seu próprio risco) com:

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

Para tornar a alteração permanente, use sudoas configurações /etc/sysctl.conf(que talvez você precise criar), da seguinte forma:

kern.maxfiles=20480
kern.maxfilesperproc=18000

Nota: No OS X 10.10 ou inferior, você pode adicionar configurações no /etc/launchd.conflike limit maxfilese ele substituirá o que você colocar aqui.

Novamente, a partir do artigo:

Depois de fazer isso, o próprio kernel terá um número máximo de arquivos, mas o shell talvez não. E como a maioria dos processos que ocupam esses arquivos serão iniciados pelo shell, você precisará 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 adicionar ao seu arquivo de configuração do shell ( .bashrc, .zshrcou qualquer outro) se você quiser que ele seja executado toda vez que você abrir um shell.

Nathan Long
fonte
11
que limite se aplica aos processos iniciados clicando nos ícones na área de inicialização? E como mudar esse limite? Quando você diz "shell", suponho que você queira dizer um shell de terminal interativo.
Cheeso
@ Chees - eu acho que o limite geral do sistema (sysctl) ou o limite de inicialização, o que for menor, controla isso.
Nathan Long
11
criar um /etc/launchd.conf com limite de conteúdo maxfiles 1000000 1000000 funcionou muito bem para mim! (OSX 10.8.2 aqui)
Zugwalt 01/02
11
Eu coloquei kern.maxfiles=65000 kern.maxfilesperproc=65000no /etc/sysctl.conf e reiniciei. O kern.maxfiles foi ignorado e permaneceu o padrão, mas o kern.maxfilesperproc foi definido como 65000. Não tenho o /etc/launchd.conf, então o que há com isso?
Pferrel
2
Se alguém tiver problemas com o máximo de arquivos que não colam, é porque existe um espaço à direita após a linha maxfiles que precisa ser excluído.
jjathman
62

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. Crie um arquivo em /Library/LaunchDaemons/limit.maxfiles.pliste cole o seguinte em (sinta-se à 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
funcionou perfeitamente, obrigado! No meu caso o erro se manifesta em um processo de java com a mensagemIO Error: Bad file descriptor (Write failed)
agradl
11
Também funciona no El Capitan 10.11.6
Troy Daniels
ainda não é possível alterar o ulimit para shell. A máxima permanece 1024 tudo o que faço
DataGreed
Na etapa 2 funcionado: sudo chmod 600 /Library/LaunchDaemons/limit.maxfiles.plist /Library/LaunchDaemons/limit.maxfiles.plist sudo chown raiz
Hai Nguyen
33

Você precisará aumentar suas configurações de ulimit - atualmente está muito baixo no OS X - 256 por padrão. Adicione ulimit -n 4096ou semelhante ao seu ~ / .profile ou equivalente e isso o resolverá em seu ambiente local. Corra ulimit -apara verificar seus níveis atuais

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

launchctl limit maxfiles

Ele é definido um pouco mais alto no Lion (10240) por processo do que costumava ser. Mas se você ainda está atingindo o local, pode configurá-lo mais alto usando o mesmo comando com os níveis desejados. Para tornar as alterações permanentes, o /etc/launchd.conf é onde você precisa adicionar as linhas relevantes.

Adam C
fonte
11
256? São 2560 descritores de arquivos para mim e nunca mudei. O limite é de 266 processos (cf ulimit -a).
slhck
2
O mesmo para mim, 256 arquivos no MacOS X Maverick
Climbatize
4
256 no OS X Yosemite também
Alexander
2
256 no El Capitan também.
TMN
11
256 em Yosemite.
Jaec
31

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:

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

lsof -n | sed -E 's/^[^ ]+[ ]+([^ ]+).*$/\1/' | uniq -c | sort | tail
sanmai
fonte
Útil! Mas a classificação no OS X (10.11) não leva -h. (Talvez -g?)
Robert Calhoun
Para mim funcionou bem apenas 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 causar meu problema .. obrigado :)
SgtPooki
11
Use lsof -n +c 0para impedir o truncamento do nome do processo.
21418
10

Gente, no Mavericks 10.9.4

ulimit -n 2048funciona bem. Pode ser necessário iniciar uma nova sessão de login.

Clustermagnet
fonte
3

Para o macOS mais recente (no momento da escrita: 10.14.1), você pode usar sudo launchctl limit maxfiles 64000 524288(por padrão, era 256), mas funciona apenas na sessão atual. Use o launchctltrabalho de @ninjaPixel ( https://superuser.com/a/1171028/760235 ) para solução permanente.

Dzmitry Hubin
fonte
Como você criou o número 524288? Meus valores anteriores eram 256 e ilimitados.
Chip Roberson
1

Você pode correr

lsof -n

processo que abre muitos arquivos.

então mate-o.

ou

sysctl -w kern.maxfiles=20480

mude para maior.

SaintKnight
fonte
3
Por favor, explique como essa resposta difere da que já foi dada.
Stephen Rauch
1

Depois de todas as alterações acima do meu java, não havia mais do que 10000 arquivos. A solução foi este sinalizador jvm -XX: -MaxFDLimit

Uros Velickovic
fonte
0

Eu o encontrei enquanto fazia um chmod -R, então resolvi-o dando passos menores, por exemplo

# for each directory
find . -type d -exec chmod 755 {} \;
Michael
fonte
11
Embora isso possa ser uma solução alternativa, ele não parece realmente responder à pergunta. Talvez explicar que você não possa se livrar da mensagem e, em seguida, propor isso como uma maneira de torná-lo menos problemático, melhore sua resposta.
precisa saber é o seguinte
0

Semelhante ao https://superuser.com/a/1171028/367819

Para verificar os limites atuais no seu sistema Mac OS X, execute:

launchctl limit maxfiles

As duas últimas colunas são os limites flexível e flexível, respectivamente.

Para ajustar os limites de arquivos abertos em todo o sistema no Mac OS X Yosemite, você deve criar dois arquivos de configuração. O primeiro é um arquivo de lista de propriedades (também conhecido como plist) em /Library/LaunchDaemons/limit.maxfiles.plist que contém a seguinte configuração XML:

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

Isso definirá o limite de arquivos abertos para 200000. O segundo arquivo de configuração do plist deve ser armazenado em /Library/LaunchDaemons/limit.maxproc.plist com o seguinte conteúdo:

<?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.maxproc</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxproc</string>
          <string>2048</string>
          <string>2048</string>
        </array>
      <key>RunAtLoad</key>
        <true />
      <key>ServiceIPC</key>
        <false />
    </dict>
  </plist>

Os dois arquivos plist devem ser de propriedade de root: wheel e ter permissões -rw-r - r--. Essas permissões devem estar em vigor por padrão, mas você pode garantir que elas estejam em vigor executando o sudo chmod 644. Embora as etapas explicadas acima façam com que os limites de arquivos abertos em todo o sistema sejam definidos corretamente na reinicialização, você pode aplicá-los manualmente executando o limite do launchctl.

Além de definir esses limites no nível do sistema, recomendamos defini-lo no nível da sessão, anexando as seguintes linhas ao seu arquivo bashrc, bashprofile ou análogo:

ulimit -n 200000
ulimit -u 2048

Como os arquivos plist, seu arquivo bashrc ou similar deve ter permissões -rw-r - r--. Nesse ponto, você pode reiniciar o computador e inserir ulimit -n no seu terminal. Se o seu sistema estiver configurado corretamente, você verá que maxfiles foi definido como 200000.


Você pode seguir este artigo para obter mais detalhes.

https://gist.github.com/tombigel/d503800a282fcadbee14b537735d202c


Lembre-se de reiniciar o seu Mac para ter os valores efetivos.

angelokh
fonte
A postagem deve ser marcada como duplicada, se já houver uma resposta; caso contrário, poste as informações relevantes em um link, pois o link pode não ser válido para sempre.
zymhan