Ejecutamos un clúster Apache Cassandra donde cada host tiene unos cientos de miles de archivos abiertos en un momento dado.
Nos gustaría ser capaz de obtener un recuento de archivos abiertos a intervalos periódicos y alimentar este número en el grafito , pero cuando nos encontramos lsof
bajo collectd
, acaba de tomar unos minutos para completar y masticando una cantidad excesiva de CPU en el ínterin .
Me pregunto si hay un medio alternativo y más amigable para obtener los mismos datos que proporciona lsof, o incluso una forma de ejecutar lsof que no se comerá en la CPU tan notablemente. (Aunque supongo que este último método probablemente tardaría mucho más en completarse de lo que lo hace actualmente ... no es lo ideal).
¿Quizás el núcleo mantiene alguna variable en algún lugar que contiene el número de archivos abiertos? Ilusiones?
Actualizar:
En respuesta a una de las respuestas, ya estamos usando las banderas -b
y -n
. Aquí está el comando completo ya que lo tengo ejecutándose 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 ': No existe tal archivo o directorio - Q @ Benoît ¿cómo puedo evitar eso?echo /proc/*/fd/* | wc -w
Lo estás haciendo mal.
Desde
man proc
El primer valor si tu gato te da exactamente lo que eres después de que aparezca.
Para el registro, no pude hacer que la
lsof
salida coincida incluso con una cierta cantidad de falsificación, pero deduzco que si eso es lo que dice el núcleo es más autoritario que la lista que obtieneslsof
todos modos.fuente
[root@ec2- cassandra101 ~]$ time lsof -b -n -w -l -L | stdbuf -i0 -o0 -e0 wc -l 1018065
. Esto es lo que dice file-nr:[root@ec2- cassandra101 ~]$ cat /proc/sys/fs/file-nr 2784 0 3093428
. La gran discrepancia (1,000,000+ versus 2784) se debe al hecho de quelsof
incluye todas las cosas que no tienen un descriptor de archivo asociado: archivos de biblioteca, excecutables, etc. Entonces, si solo está interesado en descriptores de archivos, entoncesfile-nr
es el camino a seguir, de lo contrario necesita lsof o equivalente.inode-nr
en su lugar en el mismo lugar entonces.