Por que o número de arquivos abertos é limitado no Linux?

136

No momento, eu sei como:

  • encontre o limite de arquivos abertos por processo: ulimit -n
  • conte todos os arquivos abertos por todos os processos: lsof | wc -l
  • obtenha o número máximo permitido de arquivos abertos: cat /proc/sys/fs/file-max

Minha pergunta é: Por que existe um limite de arquivos abertos no Linux?

xanpeng
fonte
2
@Rob Pesquisou um pouco no Google e descobriu que é uma bomba de garfo , pode ser usado para explicar o limite de arquivos abertos?
Xanpeng
6
Bem, os limites do processo e do arquivo são importantes para que coisas como bombas de garfo não quebrem um servidor / computador para todos os usuários, somente o usuário que faz isso e apenas temporariamente. Caso contrário, alguém em um servidor compartilhado poderá acionar uma bifurcação e derrubá-la completamente para todos os usuários, não apenas para eles mesmos.
22412 Rob
3
Bom resumindo alguns comandos muito úteis! : +1:
Joshua Pinter
7
@ Rob, uma bomba de fork não tem nada a ver com ela, pois o limite de arquivos é por processo e cada vez que você bifurca, não abre um novo identificador de arquivo.
Psusi

Respostas:

86

O motivo é que o sistema operacional precisa de memória para gerenciar cada arquivo aberto e a memória é um recurso limitado - especialmente em sistemas incorporados.

Como usuário root, você pode alterar o número máximo de arquivos abertos por processo (via ulimit -n) e por sistema (por exemplo echo 800000 > /proc/sys/fs/file-max).

jofel
fonte
21
Há também um motivo de segurança: se não houvesse limites, um software da terra do usuário seria capaz de criar arquivos infinitamente até o servidor cair.
Coren
15
@ Coren Os limites aqui discutidos são apenas para a contagem de manipuladores de arquivos abertos. Como um programa também pode fechar manipuladores de arquivos, ele pode criar quantos arquivos e o tamanho que desejar, até que todo o espaço em disco disponível esteja cheio. Para evitar isso, você pode usar cotas de disco ou partições separadas. Você é verdadeiro no sentido de que um aspecto da segurança está impedindo a exaustão de recursos - e para isso existem limites.
Jofel
1
@jofel Obrigado. Eu acho que os identificadores de arquivos abertos são representados por instâncias do arquivo struct e o tamanho dessa estrutura é muito pequeno (nível de bytes), então posso definir /.../file-maxcom um valor bastante grande, desde que a memória não seja usada?
Xanpeng
7
@xanpeng Eu não sou um especialista em kernel, mas, tanto quanto posso ver, o padrão para file-maxparece ser o tamanho da RAM dividido por 10k. Como a memória real usada por manipulador de arquivos deve ser muito menor (tamanho de struct filemais alguma memória dependente do driver), esse parece um limite bastante conservador.
Jofel
63

Observe que lsof | wc -lresume muitas entradas duplicadas (processos bifurcados podem compartilhar identificadores de arquivos etc.). Esse número pode ser muito superior ao limite definido /proc/sys/fs/file-max.

Para obter o número atual de arquivos abertos do ponto de vista do kernel do Linux, faça o seguinte:

cat /proc/sys/fs/file-nr

Exemplo: Este servidor possui 40096 dos 65536 arquivos abertos, no máximo, embora lsof relate um número muito maior:

# cat /proc/sys/fs/file-max
65536
# cat /proc/sys/fs/file-nr 
40096   0       65536
# lsof | wc -l
521504
Grebneke
fonte
1
Como lsofirá relatar muitos arquivos duas vezes ou mais, como /dev/null, você pode tentar um melhor palpite com:lsof|awk '{print $9}'|sort|uniq|wc -l
Yvan
você pode usar lsof|awk '!a[$NF]++{c++}END{print c}'para obter a contagem não duplicada de arquivos abertos.
P ....
18

Eu acho que é em grande parte por razões históricas.

Um descritor de arquivo Unix é um pequeno intvalor, retornado por funções como opene creat, e passado para read, write, closee assim por diante.

Pelo menos nas versões anteriores do Unix, um descritor de arquivo era simplesmente um índice em uma matriz de estruturas de tamanho fixo por processo, onde cada estrutura contém informações sobre um arquivo aberto. Se bem me lembro, alguns sistemas antigos limitaram o tamanho dessa tabela a 20 ou mais.

Sistemas mais modernos têm limites mais altos, mas mantêm o mesmo esquema geral, em grande parte por inércia.

Keith Thompson
fonte
1
20 era o limite do Solaris para estruturas de dados FILE no idioma C. A contagem de identificadores de arquivo era sempre maior.
Lothar
@ Lothar: Interessante. Eu me pergunto por que os limites diferem. Dadas as funções filenoe fdopen, eu esperaria que elas fossem quase intercambiáveis.
Keith Thompson
Um arquivo unix é mais do que apenas o identificador de arquivo (int) retornado. Há buffers de disco, e um bloco de controle de arquivo que define o arquivo atual offset, dono do arquivo, permissões, inode, etc.
ChuckCottrill
@ChuckCottrill: Sim, é claro. Mas a maioria dessas informações deve ser armazenada, seja um arquivo acessado via intdescritor ou a FILE*. Se você tiver mais de 20 arquivos abertos via open(), fdopen()falharia?
Keith Thompson