Cómo obtener el uso total de cpu en Linux usando C++


Estoy tratando de obtener el uso total de la cpu en %. Primero debo comenzar diciendo que " top " simplemente no lo hará, ya que hay un retraso entre volcados de cpu, requiere 2 volcados y varios segundos, lo que cuelga mi programa (no quiero darle su propio hilo)

Lo siguiente que probé es "ps", que es instantáneo pero siempre da un número muy alto en total (20+) y cuando realmente conseguí que mi cpu hiciera algo, se quedó en aproximadamente 20...

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

Author: jww, 2010-06-10

6 answers

Cat/proc / stat

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

Estoy de acuerdo con esta respuesta anterior. La línea de cpu en este archivo da 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 cualquier intervalo de tiempo que necesite. Los números están aumentando los valores (sujetos a rollover entero) por lo que para obtener el % cpu que necesita para calcular cómo muchos jiffies han transcurrido durante su intervalo, en comparación con la cantidad de jiffies se gastan haciendo el trabajo.

E. g. Supongamos que a las 14: 00: 00 tienes

Cpu 4698 591 262 8953 916 449 531

Total_jiffies_1 = (suma de todos los valores) = 16400

Work_jiffies_1 = (suma de user,nice,system = los primeros 3 valores) = 5551

Y a las 14: 00: 05 tienes

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 eso ayude un poco.

 75
Author: Hitobat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-10 18:45:08

Intenta leer /proc/loadavg. Los tres primeros números son el número de procesos en ejecución (es decir, usando una CPU), promediados en los últimos 1, 5 y 15 minutos, respectivamente.

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

 6
Author: wdebeaum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-10 18:16:25

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

Documentación pertinente: man getloadavg y man 5 proc

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

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

 6
Author: Dummy00001,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-10 18:30:12
 1
Author: Anycorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-10 18:15:36

Sugiero dos archivos para comenzar...

/proc/stat y /proc/cpuinfo.

Http://www.mjmwired.net/kernel/Documentation/filesystems/proc.txt

 0
Author: Lauro Oliveira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-10 18:26:17

Cpu-stat es un proyecto C++ que permite leer el contador de CPU de Linux desde /proc/stat .

Obtener CPUData.* y CPUSnaphot.* archivos del directorio src de cpu-stat.

Implementación rápida para obtener el uso general de la cpu:

#include "CPUSnapshot.h"

#include <chrono>
#include <thread>
#include <iostream>

int main()
{
  CPUSnapshot previousSnap;
  std::this_thread::sleep_for(std::chrono::milliseconds(1000));
  CPUSnapshot curSnap;

  const float ACTIVE_TIME = curSnap.GetActiveTimeTotal() - previousSnap.GetActiveTimeTotal();
  const float IDLE_TIME   = curSnap.GetIdleTimeTotal() - previousSnap.GetIdleTimeTotal();
  const float TOTAL_TIME  = ACTIVE_TIME + IDLE_TIME;
  int usage = 100.f * ACTIVE_TIME / TOTAL_TIME;
  std::cout << "total cpu usage: " << usage << std::endl;
}

Compilar:

g++ -std=c++11 -o CPUUsage main.cpp CPUSnapshot.cpp CPUData.cpp
 0
Author: souch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-19 08:27:04