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 lsofbajo 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 -by -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 -wLo estás haciendo mal.
Desde
man procEl primer valor si tu gato te da exactamente lo que eres después de que aparezca.
Para el registro, no pude hacer que la
lsofsalida 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 obtieneslsoftodos 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 quelsofincluye 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-nres el camino a seguir, de lo contrario necesita lsof o equivalente.inode-nren su lugar en el mismo lugar entonces.