Tentando novamente com uma pergunta mais curta e mais focada. Por favor, note que este não é o usual "por que razão é file-nr relatando um número menor do que eu esperava" pergunta. Eu tenho o problema oposto.
Um sistema Linux 2.6 está vazando identificadores de arquivos. Eu sei disso porque eu periodicamente cat / proc / sys / fs / file-nr. O primeiro número tende para cima por algumas horas, o segundo número é sempre 0. Quando o primeiro número atinge o terceiro, o login torna-se impossível, não há novos shells, etc. Então eu confio na saída do file-nr e tenho razão para acreditar que há um vazamento de identificador de arquivo significativo. (O sistema nem sempre faz isso e não encontramos rima ou razão para o que faz com que ele comece a acontecer, mas é bastante comum.)
Agora a parte estranha. Rodando como root, eu faço ls -l em todos os fd's, via / proc / each process id / fd. Note que estou fazendo isso como root, então eu deveria ver todas as alças de arquivos de todos os processos.
De acordo com o meu entendimento limitado, a saída de ls deve revelar o mesmo número de identificadores que o file-nr mostra. Eu não esperaria que fosse exato, porque os processos podem ir e vir e eles podem abrir ou fechar arquivos enquanto eu ando / proc / #. Mas feito o suficiente vezes eu esperaria, em média, um acordo grosseiro. Portanto, a primeira pergunta é: essa é uma suposição razoável e, se não, por que não?
Eu pergunto porque arquivo-nr mostra a contagem de identificadores aumentando lentamente, marcando para 65536. Mas a saída agregada de /proc/ids../fd mostra milhares menos identificadores. Em um ponto, por exemplo, file-nr parecia algo como "9900 0 65536", mas contando as alças de arquivo por processo em proc veio para menos de 2000 e feito repetidamente, ficou mais ou menos constante. O que quer que esteja vazando, não está aparecendo como um processo.
Uma diferença de mais de 7000? Quando os processos não estão iniciando e parando e não devem abrir e fechar arquivos freneticamente? Observe que o limite de identificador de arquivo rígido por processo é 1024, portanto, não é como se qualquer processo estivesse causando isso. O sistema mostra algumas dezenas de processos extintos, mas não achei que processos defuntos pudessem manter identificadores de arquivo. E eu tenho dificuldade em outras pessoas verificarem o meu trabalho, então não parece ser um uso estúpido de ls ou qualquer coisa.
Este é um problema crítico para mim e se alguém puder explicar por que há muita discordância nas contagens, isso poderia me colocar no caminho certo para resolver um problema crítico e de produção.
Note que não estou usando lsof - foi removido do sistema. Mas desde que eu estou interessado apenas em alças de arquivos reais, que podem ser diferentes de "arquivos abertos", andar / proc / #s deve ser bom o suficiente. Ou então eu pensei.