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.
cat/proc/stat
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.
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.
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
.
cat/proc/stat
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
Ich schlage zwei Dateien zum Starten vor ...
/ proc/stat und/proc/cpuinfo.
http://www.mjmwired.net/kernel/Documentation/filesystems/proc.txt