2010-06-10 19 views
34

Estoy tratando de obtener el uso total de la CPU en%. Primero debo comenzar diciendo que "top" simplemente no funcionará, ya que hay un retraso entre los volcados de la CPU, requiere 2 vuelcos y varios segundos, lo cual bloquea mi programa (no quiero darle su propio hilo)Cómo obtener el uso total de la CPU en Linux (C++)

Lo siguiente que probé es "ps", que es instantáneo pero siempre da un número muy alto en total (20+) y cuando realmente obtuve mi CPU para hacer algo, permaneció en 20 ...

¿Hay de otra manera que pueda obtener el uso total de la CPU? No importa si es más de un segundo o períodos de tiempo más largos ... Períodos más largos serían más útiles, sin embargo.

+0

He olvidado mencionar: el argumento de demora para la parte superior tampoco me sirve ... – Meltea

Respuesta

73

cat/proc/stat

http://www.linuxhowtos.org/System/procstat.htm

Estoy de acuerdo con esta respuesta anterior. La línea de la CPU en este archivo proporciona el número total de "jiffies" que su sistema ha gastado haciendo diferentes tipos de procesamiento.

Lo que necesita hacer es tomar 2 lecturas de este archivo, separadas por el intervalo de tiempo que requiera. Los números son valores crecientes (sujetos a la conversión de enteros), por lo tanto, para obtener el% de la CPU, debe calcular cuántos jiffies han transcurrido durante el intervalo, en comparación con cuántos jiffies se gastaron en el trabajo.

p. Ej.Supongamos en 14:00:00 usted tiene

CPU 4698 591 262 8953 916 449 531

total_jiffies_1 = (suma de todos los valores) = 16400

work_jiffies_1 = (suma de usuario, agradable , sistema = los 3 primeros valores) = 5551

y al 14:00:05 tiene

CPU 4739 591 289 9961 936 449 541

total_jiffies_2 = 17506

work_jiffies_2 = 5619

Así que el% de uso de CPU durante este período es:

work_over_period = work_jiffies_2 - work_jiffies_1 = 68

total_over_period = total_jiffies_2 - total_jiffies_1 = 1106

% cpu = work_over_period/total_over_period * 100 = 6,1%

Espero que ayude un poco.

+0

Acaba de terminar la función, funciona muy bien. Gracias – Meltea

+0

¿Se puede adoptar fácilmente para encontrar el uso de un proceso específico? – anon58192932

+0

La técnica es similar pero no exactamente igual. Puede obtener datos específicos del proceso del archivo/proc//stat (consulte http://www.linuxhowtos.org/manpages/5/proc.htm para obtener más información). Los datos de uso de la CPU se encuentran en los campos utime y stime, como un número de tics de reloj (en lugar de jiffies). Por lo tanto, necesita calcular cuántos tics de reloj estuvieron disponibles entre sus 2 lecturas, lo que generalmente puede aproximar al encontrar la frecuencia del reloj con sysconf. – Hitobat

1
+0

Esto parece más bien que podría funcionar ... pero ¿cuál es la capacidad total de la CPU por segundo? ¿Debería calcular con el reloj de la CPU? ¿O cómo sé qué incremento total de, digamos 125, se traduce en uso? – Meltea

+0

@dav calcule el tiempo transcurrido de la CPU, calcule el tiempo empleado en el modo usuario/sistema/lo que sea, obtenga la proporción, por ejemplo, cpu_user/cpu_ticks. – Anycorn

6

Trate de leer /proc/loadavg. Los primeros tres números son la cantidad de procesos que realmente se están ejecutando (es decir, utilizando una CPU), promediados en los últimos 1, 5 y 15 minutos, respectivamente.

http://www.linuxinsight.com/proc_loadavg.html

+0

Eso no funcionará ... Estoy buscando un porcentaje real. No veo cómo podría calcularlo a partir de esa – Meltea

+0

Esta respuesta es incorrecta, los números en '/ proc/loadavg' también se ven afectados por la E/S. – scai

6

Leer /proc/cpuinfo para encontrar el número de CPU/núcleos disponibles para los sistemas. Llame al getloadavg() (o lea alternativamente /proc/loadavg), tome el primer valor, multiplíquelo por 100 (para convertir a porcentajes), divida por número de CPU/núcleos. Si el valor es mayor que 100, trunquelo a 100. Listo.

documentación pertinente: man getloadavg y man 5 proc

N. B. El promedio de carga, usual para * sistemas NIX, puede ser más del 100% (por CPU/núcleo) porque realmente mide el número de procesos listos para ser ejecutados por el programador. Con la métrica de CPU similar a Windows, cuando la carga está al 100%, no se sabe realmente si se trata de un uso óptimo de los recursos de la CPU o si el sistema está sobrecargado. En * NIX, el uso óptimo de loadavg de la CPU le daría valor ~ 1.0 (o 2.0 para el sistema dual). Si el valor es mucho mayor que la cantidad de CPU/núcleos, es posible que desee conectar CPU adicionales en la caja.

De lo contrario, cave el sistema de archivos /proc.

+0

Interesante, acabo de dejar la computadora inactiva durante un minuto, con la parte superior a 70 segundos de retraso. Top mostró un 95% de inactividad durante ese minuto. y cuando leí loadavg me mostró 0.20, que es cuando se divide el 10% del uso. Este método es demasiado impreciso para mí. Lo más que puedo permitirme es un error del 1% ... – Meltea

+0

Tengo un sistema en el que los valores de carga promedio son muy altos. Tome un caso de uso y vea que la fórmula sugerida arriba es muy incorrecta: la primera figura de carga de/proc/loadavg es 159.47 -> multiplicado -> 15900 -> dividido por 8 (núcleo, como se informa en/proc/stat) me da una carga de 1987.5. ¿Le parece razonable simplemente truncarlo a 100? No para mí... :-) . Este problema es más complejo. Las cifras de carga en/proc/loadavg dependen de la cantidad de procesos en el sistema y los sistemas que se ven desbordados pueden ser muy receptivos. Eche un vistazo a la herramienta de línea de comandos 'collectl' –

+1

Este método en realidad le da la longitud de la cola del procesador por CPU. Aunque es una buena medida para la carga general del sistema, no representa la carga real de la CPU. Por ejemplo, si su CPU hace mucho 'iowait 'la longitud de la cola aumentará cuando el uso real de la CPU disminuya. – dtoux

Cuestiones relacionadas