2009-09-16 17 views
7

Estoy escribiendo una aplicación Linux que observa otras aplicaciones y realiza un seguimiento del consumo de recursos. Estoy planeando trabajar con Java, pero el lenguaje de programación no es importante para mí. El objetivo es importante, entonces puedo cambiar a otra tecnología o usar módulos. Mi aplicación ejecuta cualquier aplicación de terceros seleccionada como proceso secundario. La mayoría de los programas para niños resuelven algunos algoritmos, como gráficos, búsqueda de cadenas, etc. El programa de observación rastrea los recursos del niño mientras finaliza el trabajo.Seguimiento de hilos de memoria y consumo de CPU

Si la aplicación secundaria es de subprocesos múltiples, ¿quizás de alguna manera es posible rastrear cuántos recursos consume cada hilo? La aplicación podría escribirse utilizando cualquier tecnología de subprocesos de memoria no distributiva: subprocesos Java, subprocesos Boost, subprocesos POSIX, OpenMP, cualquier otro.

+1

¿Has mirado a OProfile en busca de inspiración? http://oprofile.sourceforge.net –

+0

No, este es el trabajo de mi maestría. Tal vez mi profesor miró :-) Pero OProfile se ve interesante. Gracias. – Pawka

Respuesta

5

En los sistemas Linux modernos (2.6), cada subproceso tiene un identificador separado que tiene casi el mismo tratamiento que el pid. Se muestra en la tabla de proceso (al menos, en el programa htop) y también tiene su entrada /proc por separado, es decir, /proc/<tid>/stat.

Comprobar man 5 proc y prestar especial atención a stat, statm, status etc Usted debe encontrar la información que le interesa allí.

Un único obstáculo es obtener este identificador de rosca. Es es diferente con el proceso id! Es decir. getpid() llamadas en todos los hilos devuelven el mismo valor. Para obtener el identificador de hilo actual, se debe utilizar (dentro de un programa en C):

pid_t tid = syscall(SYS_gettid); 

Por cierto, la máquina virtual de Java (al menos, su implementación OpenJDK Linux) hace que internamente y lo utiliza para fines de depuración de su back-end, pero no lo expone a la interfaz java.

4

La memoria no está asignada a subprocesos y, a menudo, se comparte entre subprocesos. Esto hace que sea generalmente imposible y al menos sin sentido hablar sobre el consumo de memoria de un hilo.

Un ejemplo podría ser un programa con 11 hilos; 1 creando objetos y 10 usando esos objetos. La mayor parte del trabajo se realiza en esos 10 hilos, pero toda la memoria se asignó en el único hilo que creó los objetos. Ahora, ¿cómo se explica eso?

+0

No puedo decir que no tengas razón.Pero podemos suponer que el uso de la memoria de un solo hilo es la cantidad de memoria con la que el hilo específico funciona en el momento actual. En su mayoría, los hilos bloquean la memoria con semophores o mutexes mientras trabaja con datos. – Pawka

+0

Lo siento, pero eso todavía no tiene sentido. La memoria de solo lectura no necesita ningún bloqueo. Cuando se utiliza un mutex, no hay una forma razonable de determinar qué memoria protege sin tener que ir al código. – MSalters

+0

No estoy hablando de memoria de solo lectura. Todavía podemos contar el consumo de memoria del hilo. Por ejemplo, trabajar con algún gráfico, crear nodos para contar, etc. Cada uno de estos datos podría ser accesible por un hilo, creado por él mismo y limpiado después de que se haya terminado el trabajo. – Pawka

1

Si usted está dispuesto a utilizar Perl echar un vistazo a esto: Sys-Statistics-Linux

que lo utilizaron, junto con algunos de los paquetes de gráficos GD para generar gráficos de uso de recursos del sistema para varios procesos.

Una cosa que debe tenerse en cuenta - realmente necesitará leer/proc y comprender los jiffies - la última vez que miré que no están documentados correctamente en las páginas de manual, deberá leer kernel source probablemente :

http://lxr.linux.no/#linux+v2.6.18/include/linux/jiffies.h

Además, recuerda que en Linux la única diferencia entre un hilo y proceso es que los hilos comparten la memoria - aparte de que son idénticos en la forma en el núcleo las implementa.

+0

El enlace Sys-Statistics-Linux está roto. –

Cuestiones relacionadas