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

30

Eu notei que em uma nova imagem do CentOS que eu acabei de inicializar do EC2 que o padrão ulimit é 1024 arquivos abertos, mas / proc / sys / fs / file-max está configurado para 761.408 e estou pensando como estes dois limites funcionam juntos. Eu estou supondo que ulimit -n é um limite por usuário do número de descritores de arquivos enquanto / proc / sys / fs / file-max é todo o sistema? Se for esse o caso, digamos que eu fiz o login duas vezes como o mesmo usuário - cada usuário logado tem um limite de 1024 no número de arquivos abertos, ou é um limite de 1024 arquivos abertos combinados entre cada um desses arquivos? nos usuários?

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

    
por bantic 15.03.2010 / 17:48

2 respostas

24

file-max é o máximo de descritores de arquivo (FD) aplicados em um nível de 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 máximo de FD definido bastante alto, enquanto que no passado ele exigia recompilação e modificação do kernel para aumentar o número passado de 1024. Eu não aumentaria todo o sistema a menos que você tenha uma necessidade técnica.

A configuração por processo geralmente precisa ser ajustada para servir 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 do sistema disponíveis; significando que você seria incapaz de corrigir o problema, exceto pressionando o botão de reset ou o ciclo de energia. É claro que qualquer um deles pode resultar em corrupção de qualquer arquivo aberto.

    
por 15.03.2010 / 17:51
10

The limitation of ulimit is per unique user. So user1, regardless of how many times logged in or processes running, would be limited to 1024. It's combined.

Não tenho certeza se entendo 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 tiver lançado 4 processos e a configuração ulimit para FDs for 1024, cada processo poderá abrir 1024 FDs. O usuário não será limitado a 1024 FDs, mas os processos que são lançados por esse usuário.

Por exemplo:

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

Aqui, um exemplo de perl onde 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 3 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.

    
por 03.10.2013 / 02:30