webentwicklung-frage-antwort-db.com.de

So erhalten Sie die vollständige CPU-Auslastung unter Linux mit C++

Ich versuche, die CPU-Auslastung in% zu ermitteln. Zuerst sollte ich sagen, dass "top" einfach nicht funktioniert, da es eine Verzögerung zwischen den CPU-Dumps gibt, es erfordert 2 Dumps und einige Sekunden, was mein Programm hängt (ich möchte nicht, dass es einen eigenen Thread gibt).

das nächste, was ich ausprobiert habe, ist "ps", das zwar sofort ist, aber immer eine sehr hohe Gesamtzahl (20+) ergibt. Als ich meine CPU tatsächlich dazu brachte, etwas zu tun, blieb es bei etwa 20 ...

Gibt es eine andere Möglichkeit, die CPU-Auslastung insgesamt zu erhalten? Es ist egal, ob es mehr als eine Sekunde oder längere Zeiträume ist ... Längere Zeiträume wären jedoch sinnvoller.

36
David Polák

cat/proc/stat

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

Ich stimme dieser Antwort zu. Die CPU-Zeile in dieser Datei gibt die Gesamtzahl der "Jiffies" an, die Ihr System für verschiedene Arten der Verarbeitung ausgegeben hat.

Was Sie tun müssen, ist zwei Messungen dieser Datei vorzunehmen, getrennt nach Zeitintervallen, die Sie benötigen. Die Zahlen sind ansteigende Werte (abhängig von Integer-Rollover). Um die% CPU zu erhalten, müssen Sie berechnen, wie viele Jiffies in Ihrem Intervall vergangen sind, im Vergleich zu der Anzahl der Jiffies, die für die Arbeit aufgewendet wurden.

angenommen, um 14:00 Uhr haben Sie 

cPU 4698 591 262 8953 916 449 531

total_jiffies_1 = (Summe aller Werte) = 16400

work_jiffies_1 = (Summe des Benutzers, Nice, System = die ersten 3 Werte) = 5551

und um 14:00:05 haben Sie

cPU 4739 591 289 9961 936 449 541

total_jiffies_2 = 17506

work_jiffies_2 = 5619

Die CPU-Auslastung in% für diesen Zeitraum ist also:

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%

Hoffe das hilft ein bisschen.

78
Hitobat

Versuchen Sie, /proc/loadavg zu lesen. Die ersten drei Zahlen sind die Anzahl der tatsächlich laufenden Prozesse (d. H. Mit einer CPU), gemittelt über die letzten 1, 5 bzw. 15 Minuten.

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

6
wdebeaum

Lesen Sie /proc/cpuinfo, um die Anzahl der für die Systeme verfügbaren CPU/Kerne zu ermitteln .__ Rufen Sie die getloadavg() (oder lesen Sie alternativ den /proc/loadavg), nehmen Sie den ersten Wert, multiplizieren Sie ihn mit 100 (zur Umwandlung in Prozente), und teilen Sie die Anzahl der CPU/kerne. Wenn der Wert größer als 100 ist, kürzen Sie ihn auf 100 ab. Fertig.

Relevante Dokumentation: man getloadavg und man 5 proc

N.B. Der für * NIX-Systeme übliche Lastdurchschnitt kann mehr als 100% (pro CPU/Kern) betragen, da er tatsächlich die Anzahl der Prozesse misst, die vom Scheduler ausgeführt werden können. Bei einer Windows-ähnlichen CPU-Metrik wissen Sie bei einer Last von 100% nicht wirklich, ob die CPU-Ressourcen optimal genutzt werden oder das System überlastet ist. Unter * NIX würde die optimale Verwendung von CPU loadavg einen Wert von ~ 1,0 (oder 2,0 für ein duales System) ergeben. Wenn der Wert viel größer als die Anzahl der CPU/Kerne ist, möchten Sie möglicherweise zusätzliche CPUs in die Box stecken.

Andernfalls suchen Sie das Dateisystem /proc.

6
Dummy00001
1
Anycorn

cpu-stat ist ein C++ - Projekt, das das Lesen eines Linux-CPU-Zählers aus/proc/stat ermöglicht.

Holen Sie sich CPUData. * - und CPUSnaphot. * -Dateien aus dem src-Verzeichnis von cpu-stat.

Schnelle Implementierung zur allgemeinen CPU-Auslastung:

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

Kompiliere es:

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

Ich schlage zwei Dateien zum Starten vor ...

/ proc/stat und/proc/cpuinfo.

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

0
Lauro Oliveira