Definir o limite máximo de arquivos em um processo em execução

27

Eu tenho um longo processo de execução que eventualmente atingirá o limite máximo de arquivos abertos. Eu sei como mudar isso depois que falha, mas existe uma maneira de mudar isso para o processo em execução, na linha de comando?

kāgii
fonte

Respostas:

28

Nos kernels mais recentes (2.6.32+) no CentOS / RHEL, você pode mudar isso em tempo de execução com / proc / <pid> / limits:

cd /proc/7671/
[root@host 7671]# cat limits  | grep nice
Max nice priority         0                    0                    
[root@host 7671]# echo -n "Max nice priority=5:6" > limits
[root@host 7671]# cat limits  | grep nice
Max nice priority         5                    6                    
Sig-IO
fonte
Isso governa! Não tinha idéia de que você poderia escrever no arquivo de limites.
Clee
4
não funciona para mim no Ubuntu 12.04
Poma
5
Isso não funciona no meu kernel 3.2 . Eu acho que sua distribuição tem um patch não oficial específico para isso, porque não vejo vestígios desse patch no fs / proc / base.c do kernel .
Totor
Pode ser ... Eu sei que está presente nos kernels do RHEL / CentOS. Não parece estar presente nos kernels do Debian.
Sig-IO
2
'setprlimit' é a maneira recomendada e à prova de futuro, veja a próxima resposta
Sig-IO
26

Conforme documentado aqui , o prlimitcomando, introduzido no util-linux 2.21, permite ler e alterar os limites dos processos em execução.

Este é um acompanhamento do gravável /proc/<pid>/limits, que não foi integrado no kernel da linha principal. Esta solução deve funcionar.

Se você ainda não possui prlimit(1), poderá encontrar o código para uma versão minimalista na página de prlimit(2)manual .

Sig-IO
fonte
2
+1 para a versão minimalista na página de manual!
Totor 14/12
Aviso: "memcached" irá falhar se você alterar "nolimit" no processo após encontrar um limite. Nem sempre é uma boa ideia usar os limites graváveis
John
2

Você pode tentar ulimit man ulimitcom a opção -n, no entanto, a página mag não permite que a maioria dos sistemas operacionais não permita que isso seja definido.

Você pode definir um limite de descrições de arquivos para todo o sistema usando sysctl -w fs.file-max=Ne fazer as alterações persistirem após a inicialização no/etc/sysctl.conf

No entanto, eu também sugeriria examinar o processo para ver se ele realmente precisa abrir tantos arquivos em um determinado momento e se você pode fechar alguns arquivos e ser mais eficiente no processo.

Oneiroi
fonte
O arquivo aberto é um bug, mas não consegui descobrir. Embora eu adorasse fazer isso, a produção periodicamente falha no meio do dia.
kāgii 12/11/2010
ulimitnão aplica configurações aos processos em execução .
try-catch-finally
0

O processo pode alterar seus próprios limites flexíveis se programado para fazê-lo (ou se você conseguir hackear), mas não poderá aumentar seus limites rígidos, a menos que possua o recurso CAP_SYS_RESOURCE. Você pode inspecionar os limites no tempo de execução em /proc/$pid/limits.

Tobu
fonte