web-dev-qa-db-fra.com

Comment obtenir l'utilisation totale du processeur sous Linux en utilisant C++

J'essaie d'obtenir l'utilisation totale du processeur en%. Premièrement, je devrais commencer par dire que "top" ne fera tout simplement pas l'affaire, car il y a un délai entre les dumps de l'unité centrale, cela nécessite 2 dumps et plusieurs secondes, ce qui bloque mon programme (je ne veux pas lui donner son propre thread)

la chose suivante que j'ai essayée est le "ps" qui est instantané mais qui donne toujours un nombre très élevé au total (20 ans et plus) et quand j'ai eu mon processeur pour faire quelque chose, il est resté à environ 20 ...

Existe-t-il un autre moyen d'obtenir une utilisation totale du processeur? Peu importe que ce soit au-dessus d'une seconde ou de plus longues périodes ... Des périodes plus longues seraient plus utiles, cependant.

36
David Polák

cat/proc/stat

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

Je suis d'accord avec cette réponse ci-dessus. La ligne cpu de ce fichier indique le nombre total de "jiffies" que votre système a consacrées à différents types de traitement.

Ce que vous devez faire, c'est prendre 2 lectures de ce fichier, séparées par l'intervalle de temps souhaité. Les nombres sont des valeurs croissantes (sujet au roulement sur un entier), donc pour obtenir le pourcentage de CPU, vous devez calculer combien de jiffies se sont écoulées au cours de votre intervalle, par rapport au nombre de jiffies consacrées au travail.

par exemple . Supposons à 14:00:00 que vous avez 

unité centrale de traitement 4698 591 262 8953 916 449 531

total_jiffies_1 = (somme de toutes les valeurs) = 16400

work_jiffies_1 = (somme de l'utilisateur, Nice, système = les 3 premières valeurs) = 5551

et à 14:00:05 vous avez

unité centrale 4739 591 289 9961 936 449 541

total_jiffies_2 = 17506

work_jiffies_2 = 5619

Donc, l’utilisation de% cpu sur cette période est:

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%

J'espère que ça aidera un peu.

78
Hitobat

Essayez de lire /proc/loadavg. Les trois premiers chiffres représentent le nombre de processus en cours d’exécution (c’est-à-dire avec un processeur), calculés en moyenne sur les 1, 5 et 15 dernières minutes respectivement.

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

6
wdebeaum

Lisez /proc/cpuinfo pour trouver le nombre de processeurs/cœurs disponibles sur les systèmes . Appelez le getloadavg() (ou lisez le /proc/loadavg), prenez la première valeur, multipliez-la par 100 (pour la convertir en pourcentages), divisez par le nombre de CPU/noyaux. Si la valeur est supérieure à 100, tronquez-la à 100. Terminé.

Documentation pertinente: man getloadavg et man 5 proc

N.B. La charge moyenne, généralement utilisée par les systèmes * NIX, peut être supérieure à 100% (par CPU/cœur) car elle mesure en réalité le nombre de processus prêts à être exécutés par le planificateur. Avec la métrique de processeur de type Windows, lorsque la charge est à 100%, vous ne savez pas vraiment s'il s'agit d'une utilisation optimale des ressources de la CPU ou si le système est surchargé. Sous * NIX, l'utilisation optimale de CPU loadavg vous donnerait la valeur ~ 1.0 (ou 2.0 pour un système dual). Si la valeur est beaucoup plus grande que le nombre de processeurs/cœurs, vous souhaiterez peut-être brancher des processeurs supplémentaires dans la boîte.

Sinon, creusez le système de fichiers /proc.

6
Dummy00001
1
Anycorn

cpu-stat est un projet C++ qui permet de lire le compteur d'unité centrale Linux depuis/proc/stat.

Récupérez les fichiers CPUData. * Et CPUSnaphot. * Dans le répertoire src de cpu-stat.

Mise en œuvre rapide pour obtenir l'utilisation globale du processeur:

#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;
}

Compilez le:

g++ -std=c++11 -o CPUUsage main.cpp CPUSnapshot.cpp CPUData.cpp
0
souch

Je suggère deux fichiers pour commencer ...

/ proc/stat et/proc/cpuinfo.

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

0
Lauro Oliveira