
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?
Responder1
A razão é que o sistema operacional precisa de memória para gerenciar cada arquivo aberto, e a memória é um recurso limitado – especialmente em sistemas embarcados.
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
).
Responder2
Observe que isso lsof | wc -l
resume muitas entradas duplicadas (processos bifurcados podem compartilhar identificadores de arquivos, etc.). Esse número pode ser muito superior ao limite estabelecido /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 40.096 de um máximo de 65.536 arquivos abertos, 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
Responder3
Acho que é em grande parte por razões históricas.
Um descritor de arquivo Unix é um int
valor pequeno, retornado por funções como open
e creat
e passado para read
, write
, close
e assim por diante.
Pelo menos nas primeiras versões 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 iniciais limitavam o tamanho desta tabela a cerca de 20.
Os sistemas mais modernos têm limites mais elevados, mas mantiveram o mesmo esquema geral, em grande parte por inércia.