Executamos um cluster Apache Cassandra em que cada host tem algumas centenas de milhares de arquivos abertos a qualquer momento.
Gostaríamos de poder obter uma contagem de arquivos abertos em intervalos periódicos e alimentar esse número com grafite , mas quando corremos para lsof
baixo collectd
, isso leva alguns minutos para ser concluído e consumir uma quantidade excessiva de CPU enquanto isso. .
Gostaria de saber se existe um meio alternativo e mais amigável de obter os mesmos dados que o lsof fornece, ou mesmo uma maneira de executar o lsof que não consome a CPU tão visivelmente? (Embora eu assuma que esse último método provavelmente levaria muito mais tempo para ser concluído do que atualmente ... não é o ideal).
Talvez o kernel mantenha alguma variável em algum lugar que contenha o número de arquivos abertos? Desejo de pensar?
Atualizar:
Em resposta a uma das respostas, já estamos usando os sinalizadores -b
e -n
. Aqui está o comando completo, como o tenho em execução collectd
:
sudo lsof -b -n -w | stdbuf -i0 -o0 -e0 wc -l
/proc/{{number}}/fd/5': No such file or directory find:
/ proc / {{number}} / fdinfo / 5 ': Esse arquivo ou diretório não existe - Q @ Benoît como posso evitar isso?echo /proc/*/fd/* | wc -w
Você está fazendo isso errado.
A partir de
man proc
O primeiro valor, se você considera que o gato é exatamente o que você é depois que ele aparece.
Para o registro, não consegui que a
lsof
saída correspondesse a ela, mesmo com alguma quantidade de falsificação, mas acho que é isso que o kernel diz que é mais autoritário do que a lista delsof
qualquer forma.fonte
[root@ec2- cassandra101 ~]$ time lsof -b -n -w -l -L | stdbuf -i0 -o0 -e0 wc -l 1018065
. Aqui está o arquivo-nr diz:[root@ec2- cassandra101 ~]$ cat /proc/sys/fs/file-nr 2784 0 3093428
. A grande discrepansia (mais de 1.000.000 versus 2784) se deve ao fato delsof
incluir todas as coisas que não possuem um descritor de arquivo associado a elas: arquivos de biblioteca, executáveis etc. Então, se você estiver interessado apenas em descritores de arquivo,file-nr
é o caminho a percorrer, caso contrário você precisa de lsof ou equivalente.inode-nr
em vez disso no mesmo local.