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?
open-files
limit
xanpeng
fonte
fonte
Respostas:
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 exemploecho 800000 > /proc/sys/fs/file-max
).fonte
/.../file-max
com um valor bastante grande, desde que a memória não seja usada?file-max
parece ser o tamanho da RAM dividido por 10k. Como a memória real usada por manipulador de arquivos deve ser muito menor (tamanho destruct file
mais alguma memória dependente do driver), esse parece um limite bastante conservador.Observe que
lsof | wc -l
resume 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:
fonte
lsof
irá 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
lsof|awk '!a[$NF]++{c++}END{print c}'
para obter a contagem não duplicada de arquivos abertos.Eu acho que é em grande parte por razões históricas.
Um descritor de arquivo Unix é um pequeno
int
valor, retornado por funções comoopen
ecreat
, e passado pararead
,write
,close
e 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.
fonte
fileno
efdopen
, eu esperaria que elas fossem quase intercambiáveis.int
descritor ou aFILE*
. Se você tiver mais de 20 arquivos abertos viaopen()
,fdopen()
falharia?