Es ist eine Frage, die oft gestellt wurde, aber es gibt keine gut unterstützte Antwort, die ich finden konnte.Genaue Berechnung der CPU-Auslastung in Prozent in Linux gegeben?
Viele Leute empfehlen die Verwendung von Top-Befehl, aber wenn Sie oben einmal ausführen (weil Sie ein Skript zum Beispiel cpu-Nutzung alle 1 Sekunde sammeln) gibt es immer die gleiche CPU-Nutzung Ergebnis (example 1, example 2).
Eine genauere Art und Weise der CPU-Auslastung zu berechnen, indem die Werte aus /proc/stat
zu lesen, aber den meisten Antworten verwenden nur die ersten 4 Felder aus /proc/stat
ihm zu berechnen (ein Beispiel here).
/proc/stat/
hat 10 Felder pro CPU-Kern ab Linux-Kernel 2.6.33!
Ich fand auch diese Accurately Calculating CPU Utilization in Linux using /proc/stat Frage, die auf das gleiche Problem hinweist, -dass die meisten anderen Fragen nur 4 aus den vielen Feldern in Betracht ziehen, aber die Antwort, die hier gegeben wird, beginnt mit "Ich denke" (nicht sicher) und betrifft nur die ersten 7 Felder (0 von 10 in /proc/stat/
)
This Perl-Skript verwendet alle Felder, um die CPU-Auslastung zu berechnen, was ich nach einiger Zeit nicht mehr richtig finde Ermittlung.
Nach einem kurzen Blick in den Kernel-Code unter here, sieht es aus wie zum Beispiel guest_nice
und guest fields
immer steigen zusammen mit nice
und user
(also sollen sie nicht in der CPU-Auslastung Berechnung einbezogen werden, da sie enthalten sind in nice
und user
Felder bereits)
/*
* Account guest cpu time to a process.
* @p: the process that the cpu time gets accounted to
* @cputime: the cpu time spent in virtual machine since the last update
* @cputime_scaled: cputime scaled by cpu frequency
*/
static void account_guest_time(struct task_struct *p, cputime_t cputime,
cputime_t cputime_scaled)
{
u64 *cpustat = kcpustat_this_cpu->cpustat;
/* Add guest time to process. */
p->utime += cputime;
p->utimescaled += cputime_scaled;
account_group_user_time(p, cputime);
p->gtime += cputime;
/* Add guest time to cpustat. */
if (task_nice(p) > 0) {
cpustat[CPUTIME_NICE] += (__force u64) cputime;
cpustat[CPUTIME_GUEST_NICE] += (__force u64) cputime;
} else {
cpustat[CPUTIME_USER] += (__force u64) cputime;
cpustat[CPUTIME_GUEST] += (__force u64) cputime;
}
}
So zusammenzufassen, was eine genaue Art und Weise ist die CPU-Auslastung in Linux zu berechnen und die in den Berechnungen und wie (die Felder zurückgeführt werden in den Ruhe betrachtet werden Felder sollen Zeit und welche Felder zu Nicht-Leerlaufzeit)?
Der richtige Weg CPU-Auslastung Informationen zu sammeln kontinuierlich jede Sekunde zu laufen 'oben -b'. –
Ich möchte Daten mit einem Drittanbieter-Skript sammeln und CPU ist nur eine der Metriken gesammelt werden müssen. Also würde ich gerne die CPU-Auslastung seit dem letzten Lauf (Intervall könnte variieren) dieses 3rd-Party-Skripts berechnen. 'top -b' läuft kontinuierlich, also muss es in einem separaten Thread laufen und die gesammelten Daten in einer anderen Ausgabe speichern. –
Welche CPU-Auslastung suchen? Ein einzelner Prozess? Systemweit? Sollte es als Prozentsatz ausgedrückt werden, Sekunden, ...? – wallyk