2009-11-02 17 views
8

Quiero saber si hay una solución eficiente para supervisar el consumo de recursos de un proceso (CPU, memoria, ancho de banda de red) en Linux. Quiero escribir un daemon en C++ que realice esta monitorización para algunos PID dados. Por lo que sé, la solución clásica es leer periódicamente la información de/proc, pero esta no parece la manera más eficiente (implica muchas llamadas al sistema). Por ejemplo, para monitorear el uso de memoria cada segundo para 50 procesos, tengo que abrir, leer y cerrar 50 archivos (esto significa 150 llamadas al sistema) cada segundo desde/proc. Por no mencionar el análisis involucrado al leer estos archivos.Supervisión de recursos programáticos por proceso en Linux

Otro problema es el consumo de ancho de banda de red: esto no se puede calcular fácilmente para cada proceso que deseo monitorear. La solución adoptada por NetHogs implica una sobrecarga bastante alta en mi opinión: captura y analiza cada paquete usando libpcap, luego, para cada paquete, el puerto local se determina y se busca en/proc para encontrar el proceso correspondiente.

¿Sabes si existen alternativas más eficientes a estos métodos presentados o cualquier biblioteca que se ocupe de estos problemas?

Respuesta

5

/usr/src/linux/Documentation/accounting/taskstats.txt

Taskstats es una interfaz basada en enlace de red para enviar por tareas y estadísticas de cada proceso desde el núcleo al espacio de usuario.

Taskstats fue diseñado para los siguientes beneficios:

  • proporcionar de manera eficiente las estadísticas durante la vida de una tarea y que su salida se
  • interfaz unificada para múltiples subsistemas contables
  • de extensibilidad para su uso por los futuros parches de contabilidad

Esta interfaz le permite controlar la CPU, la memoria y el uso de E/S mediante procesos de su elección. Solo necesita configurar y recibir mensajes en un solo socket.

Esto no diferencia (por ejemplo) la E/S de disco frente a la E/S de red. Si eso es importante para usted, puede ir con una biblioteca de interceptación LD_PRELOAD que rastrea las operaciones de socket. Asumiendo que puedes controlar el inicio de los programas que deseas observar y que no harán trampas a tus espaldas, por supuesto.

No puedo pensar en soluciones ligeras si aún fallan, pero linux-audit puede rastrear globalmente syscalls, lo que parece un poco más directo que volver a capturar y analizar su propio tráfico de red.

+0

taskstats contiene solo E/S de disco, no tanto en red como en disco – tuxx

+0

Corrección: los estados de cuenta solo leen o escriben syscalls, y no recv/send y amigos (pero esto se puede modificar fácilmente dentro del kernel). Gracias de cualquier manera. Esta parece ser la mejor solución hasta ahora. – tuxx

2

Eche un vistazo al kit de herramientas de seguimiento de linux (LTTng). Inserta puntos de rastreo en el kernel y tiene algún procesamiento posterior para obtener algunos de los tipos de estadísticas que está solicitando. Los archivos de rastreo se vuelven grandes si captura todo, pero puede mantener las cosas manejables si limita los tipos de eventos que arma.

http://lttng.org para más información ...

2

En cuanto a ancho de banda de red: This Superuser answer describe el procesamiento/proc/net/tcp para recoger el ancho de banda de red.

Sé que se pueden usar iptables para hacer la contabilidad de red (ver, p., LWN's, Linux.com's, o Shorewall's artículos), pero no veo ninguna forma práctica de hacer la contabilidad que por proceso.

0

La lectura/proc es, en última instancia, la única forma de supervisar el uso de la CPU y la memoria mediante procesos individuales sin necesidad de inyectar el código en el kernel. Si miras arriba (1), verás que leer muchos archivos en/proc es exactamente lo que hace cada segundo. Todas las herramientas y bibliotecas en modo usuario que recuperan este tipo de información deben obtenerlo de/proc.

Al igual que con el uso del ancho de banda de la red, hay varios enfoques, que más o menos se reducen a capturar todo el tráfico de red dentro y fuera de la caja. También puede considerar escribir un módulo especial netfilter (iptables) que haga exactamente el tipo de conteo que necesita sin la sobrecarga de captura de tráfico.

0

Acabo de encontrar esto porque estaba buscando respuestas a la misma cosa. solo una nota: al usar el sistema de archivos/proc, no tiene que cerrar el archivo después de cada lectura. puedes mantener el archivo abierto y cada vez que lo lees recibirás nuevas estadísticas ... por lo tanto, no deberías tener la sobrecarga de abrir y cerrar cada vez que quieras obtener las estadísticas ... lo tengo trabajando en javascript en node.js si quiere un ejemplo ...

Cuestiones relacionadas