So berechnen Sie CPU% basierend auf rohen CPU-Ticks in SNMP

7

Nach http://net-snmp.sourceforge.net/docs/mibs/ucdavis.html#scalar_notcurrent ssCpuUser , ssCpuSystem, ssCpuIdle, etc. sind für die rohen Varianten veraltet ( ssCpuRawUserusw.).

Die früheren Werte (die Dinge wie Nizza, Warten, Kernel, Interrupt usw. nicht abdecken) gaben einen Prozentwert zurück:

Der Prozentsatz der CPU-Zeit, die für die Verarbeitung von Code auf Benutzerebene aufgewendet wurde, berechnet in letzter Minute.

Dieses Objekt wurde zugunsten von ' ssCpuRawUser(50)' veraltet , mit dem dieselbe Metrik berechnet werden kann, jedoch über einen beliebigen Zeitraum.

Die Rohwerte geben die "rohe" Anzahl von Ticks zurück, die die CPU ausgegeben hat:

Die Anzahl der 'Ticks' (normalerweise 1 / 100s), die für die Verarbeitung von Code auf Benutzerebene aufgewendet wurden.

Auf einem ssCpuRaw*Multiprozessorsystem sind die Zähler über alle CPUs kumulativ, sodass ihre Summe normalerweise N * 100 beträgt (für N Prozessoren).

Meine Frage ist: Wie wandelt man die Anzahl der Zecken in Prozent um?

Das heißt, woher wissen Sie, wie viele Ticks pro Sekunde (dies ist normalerweise - was nicht immer impliziert - 1 / 100s, was entweder 1 alle 100 Sekunden bedeutet oder dass ein Tick 1/100 Sekunde darstellt).

Ich stelle mir vor, Sie müssen auch wissen, wie viele CPUs es gibt, oder Sie müssen alle CPU-Werte abrufen, um sie alle zusammen zu addieren. Ich kann anscheinend keine MIB finden, die Ihnen einen ganzzahligen Wert für die Anzahl der CPUs gibt, was die frühere Route umständlich macht. Die letztere Route scheint unzuverlässig zu sein, da sich einige der Zahlen ( manchmal ) überschneiden . Hat zum Beispiel ssCpuRawWaitdie folgende Warnung:

Dieses Objekt wird nicht auf Hosts implementiert, auf denen das zugrunde liegende Betriebssystem diese bestimmte CPU-Metrik nicht misst. Diese Zeit kann auch im ssCpuRawSystem(52)Zähler enthalten sein.

Etwas Hilfe wäre dankbar. Überall scheint nur zu sagen, dass% veraltet ist, weil es abgeleitet werden kann, aber ich habe nirgendwo etwas gefunden, das den offiziellen Standard für die Durchführung dieser Ableitung zeigt.

Die zweite Komponente ist, dass diese "Zecken" kumulativ zu sein scheinen, anstatt über einen bestimmten Zeitraum. Wie kann ich Werte über einen bestimmten Zeitraum hinweg abtasten?

Die ultimative Information, die ich möchte, ist:% Benutzer, System, Leerlauf, nett (und idealerweise stehlen, obwohl es dafür keine Standard-MIB zu geben scheint) "aktuell" (in den letzten 1-60er Jahren wäre wahrscheinlich ausreichend, mit einer Präferenz für kleinere Zeitspannen).

Bo Jeanes
quelle

Antworten:

4

Da dies absolute Zähler sind, müssten Sie diese Metriken regelmäßig abrufen und dann die Berechnung selbst durchführen. Wenn Sie also die Nummer in der nächsten Minute haben möchten, müssen Sie die Nummern abrufen, eine Minute warten und die Nummern erneut abrufen. SNMP aktualisiert diese Nummern nicht zu oft, sodass Sie diese möglicherweise ohnehin nicht jede Sekunde abrufen können.

Sobald Sie die Zähler für unbenutzte Benutzer, nette, systembezogene, inaktive Interrupts haben, können Sie die Gesamtzahl der Ticks ermitteln, indem Sie diese zusammenfassen. Sogar die MIB-Beschreibung besagt, dass eine Addition erwartet wird.

$ snmptranslate -Td .1.3.6.1.4.1.2021.11.52
UCD-SNMP-MIB::ssCpuRawSystem
...
    This object may sometimes be implemented as the
    combination of the 'ssCpuRawWait(54)' and
    'ssCpuRawKernel(55)' counters, so care must be
    taken when summing the overall raw counters."

Unabhängig davon, wie lange es her ist, seit Sie die Messungen durchgeführt haben, beträgt die Gesamtzahl der Ticks in diesem Zeitraum total1 - total0. Und der Leerlaufprozentsatz wäre (idle1-idle0)/(total1-total0).

Sie fragen: "Woher wissen Sie, wie viele Zecken pro Sekunde normalerweise sind?", Aber wie Sie sehen können, müssen Sie das nicht wissen.

Chutz
quelle
Cool, ich habe erwartet, dass dies der Fall sein könnte. Mein Problem beim Summieren der Werte ist, dass viele der Werte angeben, dass sie möglicherweise Ticks für andere Zeiten enthalten (wie in Ihrem Beispiel kann ssCpuRawSystem wait + kernel sein). Gibt es eine definitive Möglichkeit zu wissen, ob x y enthält, um Doppelzählungen zu verhindern?
Bo Jeanes
3

Da die meisten Linux-Distributionen 1/100 Ticks haben, ist eine sehr einfache Möglichkeit, dies zu tun, Bash:

[myhost]# echo "scale=2; -1 * (`snmpget -Oqv -v2c -c public localhost .1.3.6.1.4.1.2021.11.54.0;sleep 5` - `snmpget -Oqv -v2c -c public localhost .1.3.6.1.4.1.2021.11.54.0` )/`snmpwalk -Oqu -v2c -c public localhost 1.3.6.1.2.1.25.3.3.1.2 | wc -l`/5" | bc | sed 's/^\./0./' | awk '{print "CPU_IOWAIT% " $1}'

IOWAIT 0.07

[myhost]#

Unter RH / Centos und Ubuntu funktioniert es im Intervall von 5 Sekunden gut und präzise ... Weniger als das erhöht snmp den Counter32 nicht und Sie erhalten die ganze Zeit Nullen.

Ich habe Loops gemacht und mit verglichen iostat -c 5 100, auch IO mit generiert dd, und es hat gut funktioniert.

Sie können jede der ssCPUraw-OIDs (1.3.6.1.4.1.2021.11.5x von 50 bis 57, wenn ich mich nicht irre, in meinem Beispiel habe ich ssCPURawWait, 54 verwendet) verwenden, 1.3.6.1.2.1.25.3.3.1.2 | wc -lum die Anzahl der Kerne zu ermitteln. ..

Sie müssen das "Delta" des Zählers / Intervalls teilen - in meinem Fall 5 / - das ist im Grunde das, was das Skript tut!

Saulo bei PINPOINT BR
quelle
2

Zusätzlich zu dem, was Chutz bereits geschrieben hat, finden Sie den Hinweis auf die Dauer eines Ticks in man 2 times:

Die Anzahl der Taktstriche pro Sekunde kann ermittelt werden mit:

     sysconf(_SC_CLK_TCK);

Dies ist eine Systemfunktion, die in C aufgerufen werden kann, aber auch durch einfaches Ausführen getconf CLK_TCKin Ihrer Shell erhalten werden kann. Diese Zahl ist eine Kompilierung-Konstante und konnte von jedermann verändert werden , um die Quelldateien zu berühren, aber dies ein eher seltenes Ereignis sein würde - gängige Linux - Distributionen sind alle mit dem Wert 100.

Zum Beispiel:

$ getconf CLK_TCK
100
the-wabbit
quelle
Ich gehe davon aus, dass dieser Wert von der Hardware bezogen werden muss, nach der ich über SNMP frage, nicht lokal. Ich werde sehen, ob ich dies durch die begrenzte Shell tun kann, die mir gegeben wird - es sei denn, es wird über SNMP verfügbar gemacht ...?
Bo Jeanes
1
@bjeanes Ich glaube nicht, dass es ist. BTW, schaute ich auf , was Berechnungsmethode OpenNMS in seiner NetSNMP-MIB-fed Graphen mit - es ist die eine von Chutz beschrieben ähnelt: es lässt RRD die Einheiten / Zeitfenster Durchschnitt berechnen ssCpuRawUser, ssCpuRawNiceund ssCpuRawSystemteilt sich der jeweilige Wert durch die Summe von ssCpuRawUser + ssCpuRawNice + ssCpuRawSystem + ssCpuRawIdleund multipliziert mit 100, um den Prozentsatz zu erhalten. Ein anderes Diagramm zeigt einen vereinfachten Ansatz, indem nur ssCpuRaw * -Werte durch 100 geteilt werden (blind angenommen ein _SC_CLK_TCK von 100)
the-wabbit