2009-09-23 28 views
6

Quiero informar la cantidad de tiempo de CPU utilizada por subproceso en un proceso de servidor (escrito en C/C++ en Linux). No puedo encontrar el equivalente de GetThreadTimes() en Windows, pero eso es lo que estoy buscando.Por subproceso Estadísticas de CPU en Linux

¿Alguien puede indicarme la dirección correcta?

+0

¿Cuál es la respuesta? http://stackoverflow.com/questions/1431569/tracking-threads-memory-and-cpu-consumption –

Respuesta

6

getrusage (2) con RUSAGE_THREAD. Desde la página del manual:

int getrusage(int who, struct rusage *usage); 

getrusage() returns resource usage measures for who, which can be one of the following: 

[...] 

     RUSAGE_THREAD (since Linux 2.6.26) 
      Return resource usage statistics for the calling thread. 
+0

¿De qué versión de Linux es esto? Hice "man rusage" en Ubuntu 8.04 (con todos los documentos de desarrollo instalados) y no devolvió nada. Si está disponible comúnmente, entonces es probablemente una solución mejor que la que publiqué. – kdgregory

+0

Asegúrese de que a) tenga instalados los paquetes 'manpages-dev' y 'manpages-posix-dev' yb) diga 'man getrusage' –

+0

Extraño, lo tengo en las pruebas de Debian. Es del paquete manpages-dev versión 3.22-1. – tsg

3

La interfaz estándar para las estadísticas del núcleo por proceso es el sistema de archivos /proc. Si hace "man proc", puede ver qué información está almacenada, pero para el consumo de recursos por subproceso, querrá /proc/PID/task/TID/stat, donde PID es el ID del proceso y TID es la identificación del subproceso.

Aquí hay un ejemplo de salida para mi shell actual; usted tiene que mirar en la página de manual de descifrarlo:

> more /proc/25491/task/25491/stat 
25491 (bash) R 25490 25491 25491 34820 25515 4194304 955 5748 0 0 0 0 19 4 20 0 
1 0 67845700 4792320 505 4294967295 134512640 135194160 3216008544 3216007164 30 
86844944 0 65536 3686404 1266761467 0 0 0 17 0 0 0 0 0 0 
0

clock_gettime (2) con CLOCK_THREAD_CPUTIME_ID. Aquí hay un ejemplo para obtener el tiempo de CPU por subproceso en segundos:

struct timespec ts; 
if (clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts) == 0) { 
    return (double)ts.tv_sec + (double)ts.tv_nsec/1000000000; 
} 
return 0; 
Cuestiones relacionadas