Como os ulimit -n e / proc / sys / fs / file-max diferem?

32

Percebo que em uma nova imagem do CentOS que acabei de inicializar no EC2, o padrão ulimit é 1024 arquivos abertos, mas / proc / sys / fs / file-max está definido em 761.408 e estou imaginando como esses dois limites funcionam. juntos. Eu estou supondo que ulimit -n é um limite por usuário do número de descritores de arquivo, enquanto / proc / sys / fs / file-max é amplo em todo o sistema? Se for esse o caso, digamos que entrei duas vezes com o mesmo usuário - cada usuário conectado tem um limite de 1024 no número de arquivos abertos ou um limite de 1024 arquivos abertos combinados entre cada um desses usuários- em usuários?

E há muito impacto no desempenho ao definir seus descritores máximos de arquivos para um número muito alto, se o seu sistema nunca estiver abrindo muitos arquivos?

bantic
fonte
Tags adicionadas: bash linux kernel system-resources
Warner

Respostas:

28

file-maxé o máximo de descritores de arquivo (FD) imposto no nível do kernel, que não pode ser superado por todos os processos sem aumentar. O ulimité aplicado em um nível de processo, que pode ser menor que o file-max.

Não há risco de impacto no desempenho aumentando file-max. As distribuições modernas têm o FD máximo definido bastante alto, enquanto no passado exigia recompilação e modificação do kernel para aumentar para além de 1024. Eu não aumentaria o sistema inteiro, a menos que você tenha uma necessidade técnica.

A configuração por processo geralmente precisa ser ajustada para atender a um daemon específico, seja um banco de dados ou um servidor da Web. Se você remover completamente o limite, esse daemon poderá esgotar todos os recursos de sistema disponíveis; ou seja, você não conseguiria resolver o problema, exceto pressionando o botão de reset ou o ciclo de energia. Obviamente, é provável que qualquer um desses itens danifique os arquivos abertos.

Warner
fonte
Meu entendimento está correto de que os limites definidos por usuário usando ulimit são iguais para todos os usuários? Existe uma maneira de usar valores diferentes por usuário ou não?
266 Oliver Oliver
Sim, as configurações podem ser definidas globalmente e por usuário.
21313 Warner
Se eu acertar sua postagem, isso não é verdade. É por processo gerado por xy utilizador, e este é limitada pelo sistema de ficheiros máximo definido em /etc/sysctl.conf
Jeredepp
3
O ulimitlimite não é por usuário, mas por processo! Veja unix.stackexchange.com/questions/55319/…
Tonin
@ Tonin - Sim, esta resposta está errada.
Nemo
11

A limitação do ulimit é por usuário único. Portanto, o usuário1, independentemente de quantas vezes efetuou login ou processos em execução, seria limitado a 1024. É combinado.

Não sei se entendi completamente o significado dessa frase (o inglês não é minha língua materna). Se essa frase significa que a configuração ulimit para descritores de arquivo não é uma limitação por processo, a resposta aceita (AFAIK) está errada.

O que quero dizer é que, se algum usuário lançou 4 processos e a configuração ulimit para FDs é 1024, cada processo pode abrir 1024 FDs. O usuário não ficará limitado a 1024 FDs, mas aos processos iniciados por esse usuário.

Por exemplo:

me@superme:~$ ulimit -n
1024
me@superme:~$ lsof | grep $USER | wc -l
8145

Aqui está um exemplo perl em que atingimos o limite (é um limite por processo):

#!/usr/bin/perl

$count = 0;
@filedescriptors;

while ($count <= 1024) {
    $FILE = ${count};
    open $FILE, ">", "/tmp/example$count" or die "\n\n FDs: $count $!";
    push(@filedescriptors, $FILE);
    $count ++;
}

Resultado:

FDs: 1021 Too many open files at ./test.pl line 8.

1021 porque havia três descritores de arquivos abertos antes de atingir o loop while (stdout, stdin e stderr)

Desculpe se estou completamente errado ou não entendi a resposta.

Gooseman
fonte
Então, você está certo. A resposta da @ Warner está errada nesse sentido, porque o limite é baseado em cada processo e não por usuário
filipenf