UNIX - Kernel - Load Average (ohne Shell auslesen)
-
Servus,
die Überschrift sagt schon, wozu ich zu bl... bin
Ich schreibe mir gerade ein kleine Library, die mir gewisse Systeminfo's liefert + Eventsystem. Jetzt greife ich unter UNIX den Load Average mittels uptime, procinfo, w, top, ... oder direkt von der Ausgabedatei des Kernels ab. Leider verursachen diese Lösungen alle einen gewissen Overhead und ich kann diesen nicht akzeptieren (zu groß!).
Meine Frage daher: Gibt es eine Möglichkeit direkt aus dem Kernel, Informationen über die Auslastung des Systems zu erhalten?
Es muss keine Prozentangabe sein! In diesem Fall müsste man nur wissen, wie die Werte zu interpretieren sind.
Load Average: http://www.teamquest.com/resources/gunther/display/5/index.htm
Auf Windows
double GetCPULoad() { static DWORD dwLastProcessTime = 0; static DWORD dwLastSystemTime = 0; static double dCPULoad = 0; FILETIME ftCreationTime, ftExitTime, ftKernelTime, ftUserTime; GetProcessTimes(GetCurrentProcess(),&ftCreationTime,&ftExitTime,&ftKernelTime,&ftUserTime); ULARGE_INTEGER uiKernelTime, uiUserTime; uiKernelTime.HighPart = ftKernelTime.dwHighDateTime; uiKernelTime.LowPart = ftKernelTime.dwLowDateTime; uiUserTime.HighPart = ftUserTime.dwHighDateTime; uiUserTime.LowPart = ftUserTime.dwLowDateTime; DWORD dwActualProcessTime = (DWORD)((uiKernelTime.QuadPart + uiUserTime.QuadPart)/100); DWORD dwActualSystemTime = GetTickCount(); if(dwLastSystemTime) { dCPULoad = (double)(dwActualProcessTime-dwLastProcessTime)/(dwActualSystemTime-dwLastSystemTime); } dwLastProcessTime = dwActualProcessTime; dwLastSystemTime = dwActualSystemTime; return dCPULoad; } //Quelle: //http://www.hardwareluxx.de/community/archive/index.php/t-410669.html //http://www.c-plusplus.net/forum/viewtopic-var-t-is-86669.html
Gruß,
Thomas
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Du suchst nach einer Möglichkeit, die Prozesszeit und die "reale" Zeit zu messen und in ein Verhältnis zu setzen!?
Das ganze nur für den aktuell laufenden Prozess oder einen beliebigen?
(Ersteres lässt sich einfach mittels man: clock_gettime und den passenden "Uhren" realisieren.)
Der Load-Average widerum ist etwas anderes... systemweit halt.
Öffnen und auswerten von /proc/loadavg ist an sich keine große Sache. Was genau ist da "zu großer Overhead"?
-
Servus,
Das ganze nur für den aktuell laufenden Prozess oder einen beliebigen?
Vorerst nur die Auslastung für das aktuelle BS-System.
Später werde ich die einzelnen Prozesse auch noch analysieren und auf Regelmäßigkeiten überprüfen. z.B. Die CPU-Last und/oder RAM-Verbrauch eines Prozesses XyZ zeigen über einen Betrachtungszeitraum t eine Folge -> Es kann mit einer Wahrscheinlichkeit A die genannten Werte für den Zeitpunkt t1>now voraussagen.
Öffnen und auswerten von /proc/loadavg ist an sich keine große Sache. Was genau ist da "zu großer Overhead"?
Naja, ich erzeuge damit in regelmäßigen Abstände Lesezugriff auf die Festplatte und/oder RAM. Hiernach habe ich lediglich eine Liste1, die ich noch Auswerten muss!
Ein Mini-Benchmark (von mir; Aussagekraft naja) ergab, dass sich die Windowslösung um einiges weniger an Ressourcen benötigt, wie die UNIX-Variante. Dabei habe ich evtl. Compiler-Unterschiede schon mit berücksichtigt. Dennoch möchte ich die Ergebnisse nicht als korrekt hinstellen, aber es hat sich ein eindeutiger Trend abgezeichnet.Liste1: Leider musste ich feststellen, dass diese nicht auf jedem System gleich aufgebaut ist. z.B. SuSe und Ubuntu vs. Solaris
Gruss,
Thomas
-
was ist ein BS-System?
das muss in jedem os gleich funktionieren. solange du keine extra hardware zur überwachung der auslastung hast, wirst du das immer in software machen müssen. wie glaubst du, gibt windows diese daten an den prozess weiter? sie müssen genauso aus dem kernel in den speicher des prozesses geschrieben werden.
diese benchmark würde ich gerne sehen. ich kann mir nur schwer vorstellen, dass hier unterschiede existieren.
Dabei habe ich evtl. Compiler-Unterschiede schon mit berücksichtigt
und die wären genau?
-
Servus,
manchmal sieht man den Wald vor lauter Bäumen nicht. Unter
#include <sys/sysinfo.h>
Quelle: http://www.kernel.org/doc/man-pages/online/pages/man2/sysinfo.2.html
lassen sich alle Informationen aus dem Kernel auslesen. Schäm
...das muss in jedem os gleich funktionieren. solange du keine extra hardware zur überwachung der auslastung hast...
Da hast du was falsch verstanden. Ich meine damit nur, dass die Informationslisten unter /proc/loadavg, procinfo, ... nicht auf jedem UNIX-System gleich sind. Da gibt es durch aus unterschiedliche Formatierungen.
-
hast du auch den "Conforming to" teil der manpage zu sysinfo gelesen?
ok. dann hab ich dich wirklich ganz falsch verstanden.