2012-01-11 33 views
5

trato de hacer un programa con C/C++, a comportarse como la parte superior de comandos en Linux. Investigué un poco y ya sabía cómo contar el uso de CPU de un proceso. Podemos obtener el uso de la CPU calculando stime + utime desde/proc/[PID]/stat en la hora actual y después de varios segundos. Luego calcule las diferencias stime + utime y divida el resultado con las diferencias de uptime en, luego obtenemos el porcentaje de uso de la CPU. Será tan fácil en proceso único/proceso de múltiples hilos.Cómo contar el uso de CPU de aplicación multiproceso en Linux

El problema es en el caso como httpd, donde funciona como multiproceso. Cuando el servidor web está ocupado, httpd bifurca los procesos secundarios para atender varias solicitudes. Luego cuento el número del proceso total, digamos 500. Quiero calcular el uso de la CPU de esos procesos, pero los resumo para que solo vea 1 uso de CPU httpd. Pero si hago el algoritmo como he mencionado anteriormente, cuando el número de procesos disminuye a < 500 después de varios segundos, obtengo los valores negativos, ya que el cálculo será así (por ejemplo, elijo un número aleatorio, solo para le dará una breve descripción):

Uptime: 155123, No of processes : 500, Stime + Utime total of 500 processes : 3887481923874 
Uptime: 155545, No of processes : 390, Stime + Utime total of 390 processes : 2887123343874 

Si se mira el ejemplo anterior, el delta del sTime + utime se da como resultado un valor negativo, ya que el número de proceso de disminución, y darle el valor más bajo después de unos pocos milisegundos. Solo quiero saber, ¿hay alguna otra manera de calcular tal proceso comportarse así? Gracias.

+0

¿Cómo se conoce el conjunto de procesos? Por su grupo de proceso? Por el nombre del programa? –

+0

Primero, obtengo el proceso padre principal. Lo sé porque tiene ppid 1 y digamos que es pid 1227. Luego, busque el directorio completo/proc /, que tiene ppid 1227. Si el/proc/pid1/stat tiene ppid 1227, entonces agrego su utime y stime a 1227 utime y stime. –

Respuesta

1

Sugiero mantener los datos para cada proceso por separado.
Cuando tiene una nueva muestra, cada proceso puede pertenecer a una de tres categorías:
1. Existió antes y después: restar lo viejo de lo nuevo.
2. Existe ahora, pero no antes, simplemente tome los nuevos valores.
3. Existió antes, pero no ahora, ignórelo. Te falta algo aquí, porque puede haber usado CPU durante el 90% de tu período de muestra, pero espero que no necesites una precisión perfecta.

Le hace mantener más datos entre muestras, y requiere el uso de una estructura de datos más complicada, pero debería dar resultados razonables.

+0

Sí, creo que eso resolverá el problema, pero costará un trabajo complejo. Trataré de mantener TOP 200 PID que exista lo suficiente, y seguir restando hasta que uno obtenga 0 y reemplazarlo con el recién llegado. La resta se agregará a un contenedor, que se mezclará con el recién llegado. Creo que debería intentarlo. Gracias. –

0

Si necesita un resultado preciso o si el tiempo de vida de los procesos es corto, entonces debe leer el uso del tiempo de un proceso cuando finaliza.

Hay al menos dos maneras:

1) el uso o wait4(2)wait3(2) funciones que esperar la terminación del proceso. Esas funciones devolverán utime y stime del proceso.

2) Mantener los procesos terminados en estado zombie hasta la lectura de /prox/<pid>/stat.

Cuestiones relacionadas