Die Berechnung des Ladedurchschnitts wird am besten als gleitender Durchschnitt Vonprozessen in der Laufwarteschlange von Linux angesehen, die als ausgeführt oder unterbrechungsfrei markiert sind. Die Worte „gedacht“ wurden aus einem bestimmten Grund gewählt: So sollen die Maßnahmensind interpretiert werden, aber nicht genau das, was hinter dem Vorhang passiert. An diesem Punkt unserer Reise scheint die Realität von itall, wie die Quantenmechanik, nicht so intuitiv zu passen, wie sie sich präsentiert.,
Die Lastmittelwerte, die die Befehle top und uptime anzeigen, werden direkt aus /proc ermittelt. Wenn Sie Linux Kernel 2.4 oder höher ausführen, können Sie diese Werte mit dem Befehl cat/proc/loadavg selbst lesen. Es ist jedoch der Linux-Kernel, der thosevalues in /proc erzeugt. Speziell timer.c und sched.h arbeiten zusammen todo die berechnung. Um zu verstehen, was timer.c nicht für ein Leben, theconcept von time-slicing, und der Ruck-zuck-Zähler-Hilfe Runden das Bild ab.
Im Linux-Kernel erhält jeder dispatchable Prozess eine feste Zeitspanne auf der CPU pro Versand., Standardmäßig beträgt dieser Betrag 10 Millisekunden oder 1/100 Sekunde. Für diese kurze Zeitspanne wird der Prozess zugewieseneine physische CPU, auf der seine Anweisungen ausgeführt werden sollen, und darf diesen Prozessor übernehmen. Meistens gibt der Prozess die Kontrolle auf, bevor die 10 ms über Socket-Aufrufe, E/A-Aufrufe oder Rückrufe an den Kernel ausgeführt werden. (Auf einem Intel 2,6 GHz prozessor, 10 ms ist genug zeit forapproximately 50-millionen anweisungen auftreten. Das ist mehr als genug Verarbeitungszeit für die meisten Anwendungszyklen.,) Wenn der Prozess seine zugewiesene CPU-Zeit von 10 ms verwendet,wird ein Interrupt von der Hardware ausgelöst und der Kernel erhält die Kontrolle über den Prozess zurück. Der Kernel dann promptypenalisiert den Prozess für ein solches Schwein zu sein. Wie Sie sehen, ist dieses Timeslicing ein wichtiges Designkonzept, um Ihr System von außen reibungslos funktionieren zu lassen. Es ist auch das Fahrzeug, das die Durchschnittswerte liefert.
Die 10ms-Zeitscheibe ist ein wichtiges Konzept, um einen Wert für sich selbst zu rechtfertigen: Quantenwert., Es gibt nicht notwendigerweise anythinginherently special über 10ms, aber es gibt über den Quantenwert im Allgemeinen,weil welcher Wert auch immer es eingestellt ist (es ist konfigurierbar, aber 10ms ist der Standard), es steuert, wie oft auf ein Minimum der Kerneltakes Kontrolle über das System zurück von den Anwendungen. Einer der Manychores, die der Kernel ausführt, wenn er die Kontrolle zurücknimmt, besteht darin, seinen Jiffies-Zähler zu erhöhen. Der Jiffies-Zähler misst die Anzahl Derquantum-Ticks, die seit dem Booten des Systems aufgetreten sind. Wenn der Quantum Timer erscheint, Timer.c wird bei einer Funktion im Kernel calledtimer eingegeben.,c:do_timer(). Hier sind alle Interrupts deaktiviert, sodass der Code nicht mit sich bewegenden Zielen arbeitet. Der Jiffies-Zähler wird um 1 erhöht,und die Lastdurchschnittsberechnung wird überprüft, ob dies der Fall sein sollte computed.In tatsächlich wird die lastdurchschnittliche Berechnung nicht wirklich ein Quantentick berechnet, sondern von einem variablen Wert angetrieben, der auf der jeweiligen Frequenzeinstellung basiert und an jedem Quantentick getestet wird. (HZ ist nicht mit der MHz-Bewertung des Prozessors zu verwechseln. Diese Variable legt die Pulserate bestimmter Linux-Kernel-Aktivitäten fest und 1HZ entspricht standardmäßig einem Quantum or10ms.,) Obwohl der HZ-Wert in einigen Versionen des Kernels konfiguriert werden kann, wird er normalerweise auf 100 gesetzt. Der Berechnungscode verwendetder HZ-Wert zur Bestimmung der Berechnungsfrequenz. Insbesondere ist der timer.c: Die Funktion calc_load() führt den Mittelungsalgorithmus alle 5 * HZ oder ungefähr alle fünf Sekunden aus. Es folgt diese Funktion in itsentirety:
Das runrun-Array enthält die drei Mittelwerte, die wir diskutiert haben. Thecalc_load () Funktion wird von update_times () aufgerufen, auch in Timer gefunden.c und ist der Code, der für die Bereitstellung der Funktion calc_load() mit dem Parameter theticks verantwortlich ist., Leider verrät diese Funktion nicht ihrerinteressantester Aspekt: die Berechnung selbst. Das lässt sich aber leicht in sched lokalisieren.h, ein Header, der von einem Großteil des Kernels verwendet wird code.In dort stehen das Makro CALC_LOAD und die zugehörigen Werte zur Verfügung:
Hier treffen die Reifen auf die Fahrbahn. Nun sollte sich zeigen, dass die Realität nicht mit der Illusion übereinstimmt. Zumindest ist dies sicherlich nicht die Art von Mittelwertbildung, die die meisten von uns in der Graduiertenschule unterrichten. Aber es ist trotzdem ein Durchschnitt., Technisch gesehen ist es eine Exponentialdecay-Funktion und ist der gleitende Durchschnitt der Wahl für die meisten UNIX-systemsowie Linux. Lassen Sie uns seine Details untersuchen.
Das Makro nimmt drei Parameter auf: den Load-Average-Bucket (eines der drei Elemente in runrun), einen konstanten Exponenten und die Anzahl der laufenden/unterbrechungsfreien Prozesse, die sich derzeit in der Run-Warteschlange befinden. Die möglichen Exponentenkonstanten sind oben aufgeführt: EXP_1 für den 1-Minuteaverage, EXP_5 für den 5-Minuten-Durchschnitt und EXP_15 für den 15-Minuteaverage. Der wichtige Punkt zu beachten ist, dass der Wert abnimmt mit dem Alter., Die Konstanten sind magische Zahlen, die durch diemathematische Funktion unten gezeigt:
Wenn x=1, dann y=1884; wenn x=5, dann y=2014; und wenn x=15, dann y=2037. Thepurpose der magischen Zahlen ist, dass es dem Makro CALC_LOAD erlaubt, präzise Festpunktdarstellung von Brüchen zu verwenden. Die Magicnumbers sind dann nichts anderes als Multiplikatoren, die gegen den Runningload-Durchschnitt verwendet werden, um ihn zu einem gleitenden Durchschnitt zu machen. (Die Mathematik offixed-Punkt-Darstellung würde den Rahmen dieses Artikels, also werde ich notattempt eine Erklärung.,) Der Zweck des exponentiellen Zerfall functionis, dass es glättet nicht nur die dips und spikes durch die Aufrechterhaltung einer usefultrend Linie, aber es genau nimmt die Qualität von dem, was es measuresas Aktivität Alter. Mit fortschreitender Zeit nehmen aufeinanderfolgende CPU-Ereignisse zuihre Bedeutung für den Lastdurchschnitt. Dies ist, was wir wollen, weilmehr jüngste CPU-Aktivität hat wahrscheinlich mehr Einfluss auf den currentstate als alte Ereignisse., Am Ende ergeben die Lastdurchschnitte einen Glattentrend von 15 Minuten bis zur aktuellen Minute und geben uns ein Fenster intonot nur die CPU-Auslastung, sondern auch die durchschnittliche Nachfrage nach den CPUs. Da der Loadaverage über der Anzahl der physischen CPUs liegt, wird die CPU umso mehrverwendet und desto mehr Nachfrage besteht danach. Und je geringer die Nachfrage, desto geringer die Nachfrage. Mit diesem Verständnis kann der Lastdurchschnitt mit dem CPU-Prozentsatz verwendet werden, um eine genauere Ansicht der CPU-Aktivität zu erhalten.,
Ich hoffe, dass dies nicht nur als praktische Interpretation der Lastmittelwerte von Linux dient, sondern auch einige der dunklen mathematischen Schatten dahinter beleuchtet. Für weitere Informationen würde eine Untersuchung der Exponentialdecay-Funktion und ihrer Anwendungen mehr Licht auf das Projekt werfen. Aber für die praktischeren, Plotten der Last averagevs. eine kontrollierte Anzahl von Prozessen (dh die Modellierung der Auswirkungen des CALC_LOAD-Algorithmus in einer kontrollierten Schleife) würde Ihnen ein Gefühl für die tatsächliche Beziehung und die Anwendung des Zerfallsfilters geben.