O nofile
limite padrão para contas de usuário do OS X parece ser de cerca de 256 descritores de arquivo atualmente. Estou tentando testar algum software que precise de muito mais conexões do que as abertas de uma só vez.
Em uma caixa Debian típica executando o módulo de limites de pam, eu editaria /etc/security/limits.conf
para definir limites mais altos para o usuário que executará o software, mas estou confuso sobre onde definir esses limites no OS X.
Existe uma GUI em algum lugar para isso? Existe um arquivo de configuração em algum lugar para isso? Qual é a maneira mais organizada de alterar os ulimits padrão no OS X?
Respostas:
Sob o Leopard, o processo inicial é
launchd
. Os ulimits padrão de cada processo são herdadoslaunchd
. Para referência, os limites padrão (compilados) sãoPara alterar qualquer um desses limites, adicione uma linha (talvez seja necessário criar o arquivo primeiro) para
/etc/launchd.conf
, os argumentos são os mesmos que foram passados para olaunchctl
comando. Por exemploNo entanto
launchd
, já iniciou seu shell de login, portanto, a maneira mais simples de fazer essas alterações entrar em vigor é reiniciar nossa máquina. (Use >> para anexar ao /etc/launchd.conf.)fonte
sysctl.maxfiles
? (questão relacionada: apple.stackexchange.com/questions/33715/too-many-open-files )echo
no sudo, mas está tentando anexar o seu shell sem privilégios ao arquivo, o que ele não tem permissão para fazer. Tente emecho "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.conf
vez disso.não funciona porque o sudo está no lugar errado, tente o seguinte:
fonte
Limites de Shell
Recursos disponíveis para o shell e os processos podem ser alterados pelo
ulimit
comando que pode ser adicionado a scripts de inicialização, como~/.bashrc
ou~/.bash_profile
para usuários individuais ou/etc/bashrc
para todos os usuários . Exemplo de linha a ser adicionada:Veja:
help ulimit
eman bash
para mais informações.Limites do sistema
Em geral, os limites do sistema são controlados pela estrutura Launchd e podem ser alterados por
launchctl
comando, por exemploPara tornar as alterações persistentes, você precisa criar um arquivo de lista de propriedades em pastas específicas compatíveis com o Launch que atuam como um agente de inicialização.
Aqui está o comando de exemplo que cria esse arquivo de inicialização:
O arquivo seria carregado no lançamento do sistema, no entanto, para carregar para executar manualmente:
Para verificar os limites atuais, execute:
launchctl limit
.Consulte: Criando daemons e agentes de inicialização .
Limites do kernel
sysctl
comandosysctl -a | grep ^kern.max
.sudo sysctl -w kern.maxfiles=20480
.Palavras-chave:
Métodos preteridos
Na versão anterior do macOS, era possível definir esses limites em todo o
/etc/sysctl.conf
sistema, como normalmente no Unix, no entanto, parece que não há suporte.O uso
~/.launchd.conf
ou/etc/launchd.conf
parece que ele também não é suportado em nenhuma versão existente do macOS. wikiMesmo com o
/etc/rc.local
arquivo de inicialização, ele não é suportado no macOS.fonte
Agora eu tenho que descobrir por que existem dois meios de verificar / definir limites ....
Ok - parece
ulimit
esysctl
dá uma sensação falso-positiva de que eles realmente fazem alguma coisa - mas, em vez disso, parecem inúteis . Alguém poderia verificar isso?Ok, estou começando a entender. A partir da v10.4, não há
init
mais processo, ele foi substituído porlaunchd
, que também é executado com um PID de 1.E, claro, vale a pena mencionar é que
ulimit
é um shell embutido,launchctl
é um programa independente do shell.fonte
No OS X, se você estiver tentando modificar os limites flexíveis para um daemon ou processo ou tarefa, a maneira correta de alterar esses limites flexíveis não é alterando a configuração padrão launchd para todos os processos, mas definindo-o para o processo em que está. tentando correr.
Isso é realizado no seu arquivo launchd .plist para o seu processo.
Se você possui um daemon ou processo em execução para o qual precisa de mais arquivos abertos, crie um arquivo plist para ele e adicione esses parâmetros:
Um exemplo, usando o mongodb. Eu crio um arquivo .plist chamado org.mongo.mongodb.plist e salve-o em /Library/LaunchDaemons/org.mongo.mongodb.plist. O arquivo fica assim:
Agora seu processo tem os recursos necessários, sem mexer na configuração global do sistema. Isso será configurado automaticamente na reinicialização. Ou, se você não quiser reiniciar, poderá executar
Se o seu processo ou tarefa for mais um agente do que um daemon, você poderá colocar o .plist em / Library / LaunchAgents. Regras diferentes se aplicam para como o launchd controlará seu processo nos dois casos. O LaunchDaemons parece reservado para processos que o launchd tentará acompanhar o tempo todo.
fonte
O seguinte deve resolver a maioria das soluções (e são listadas na ordem de sua hierarquia):
Notas:
fonte
Minha experiência é que minha tarefa de alta contagem de processos só conseguiu:
Os dois primeiros podem entrar
/etc/sysctl.conf
e o valor ulimit em launchd.conf, para uma configuração confiável.Como tcp / ip fazia parte do que eu estava fazendo, eu também precisava aumentar
do seu padrão 128.
Antes de aumentar os limites do processo, eu estava recebendo falhas de "bifurcação", sem recursos suficientes. Antes de aumentar o kern.ipc.somaxconn, eu estava recebendo erros de "tubo quebrado".
Isso ocorreu durante a execução de um número razoável (500-4000) de processos desanexados no meu monstro Mac, OS 10.5.7, depois 10.5.8, agora 10.6.1. No Linux, no computador dos meus chefes, funcionava.
Eu pensei que o número de processos estaria mais próximo de 1000, mas parece que todo processo iniciado incluía sua própria cópia do shell, além do item real realizando o trabalho real. Muito festivo.
Eu escrevi um brinquedo de exibição que era algo como:
e observei o número máximo de processos no ps -ef e circulando no netstat esperando
TIME_WAIT
expirar ... Com os limites aumentados, vi mais de 3500TIME_WAIT
itens no pico.Antes de aumentar os limites, eu podia 'esgueirar-me' do limiar de falha, que começava abaixo de 1K, mas subia para um valor alto de 1190 .. toda vez que era introduzido na falha, poderia demorar um pouco mais na próxima vez, provavelmente por causa de algo em cache que se expandia ao limite toda vez que falhava.
Embora meu caso de teste tivesse uma "espera" como declaração final, ainda havia MUITOS processos desanexados por aí depois que ele saiu.
Eu recebi a maioria das informações que usei de postagens na internet, mas nem todas eram precisas. Sua milhagem pode variar.
fonte