Tentando novamente com uma pergunta mais curta e mais focada. Observe que esta NÃO é a pergunta usual "por que o arquivo nr está relatando um número menor do que o esperado". Eu tenho o problema oposto.
Um sistema Linux 2.6 está vazando identificadores de arquivo. Eu sei disso porque periodicamente cat /proc/sys/fs/file-nr. O primeiro número tende a aumentar em 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. um vazamento significativo de identificador de arquivo. (O sistema nem sempre faz isso e não encontramos rima ou razão para o que faz isso começar a acontecer, mas é bastante comum.)
Agora a parte estranha. Executando como root, eu faço ls -l em todos os fds, via /proc/each process id/fd. Observe que estou fazendo isso como root, portanto, devo ver todos os identificadores de arquivo de todos os processos.
De acordo com meu entendimento limitado, a saÃda de ls deve revelar aproximadamente 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 estou andando /proc/#. Mas feito o suficiente, eu esperaria, em média, um acordo aproximado. Portanto, a primeira pergunta é: essa suposição é razoável e, se não, por que não?
Eu pergunto porque file-nr mostra a contagem de identificador aumentando lentamente, marchando para 65536. Mas a saÃda agregada de /proc/ids../fd mostra milhares de identificadores a menos. Em um ponto, por exemplo, file-nr parecia algo como "9900 0 65536", mas a contagem dos identificadores de arquivo por processo no proc chegou a menos de 2.000 e, feita repetidamente, permaneceu mais ou menos constante. O que quer que esteja vazando, as alças não estão aparecendo como um processo.
Uma diferença de mais de 7000? Quando os processos não estão iniciando e parando descontroladamente e não deveriam estar abrindo e fechando arquivos freneticamente? Observe que o limite de manuseio de arquivo fÃsico por processo é 1024, portanto, não é como se algum processo estivesse causando isso. O sistema mostra algumas dezenas de processos extintos, mas não pensei que processos extintos pudessem reter identificadores de arquivo. E eu tenho outras pessoas verificando meu trabalho para que não pareça ser um mau uso estúpido de ls ou algo assim.
Este é um problema crÃtico para mim e se alguém puder explicar por que há tanta discordância nas contagens, isso poderia me colocar no caminho certo para resolver um problema crÃtico e de interrupção da produção.
Observe que não estou usando lsof - ele foi removido do sistema. Mas, como estou interessado apenas em manipulações de arquivos reais, que podem ser diferentes de "arquivos abertos", percorrer /proc/#s deve ser bom o suficiente. Ou então eu pensei.
Acontece que, pelo menos no Linux 2.6, é possÃvel que processos extintos se apeguem aos manipuladores de arquivos. Não tenho ideia de como, mas quando limpamos à força os processos sshd extintos, a contagem de identificadores voltou a cair.