Wie wird der Lastdurchschnitt auf osx berechnet? Es scheint zu hoch - und wie analysiere ich es?

7

Eine fortgeschrittene Frage: Ich denke, meine durchschnittlichen Lastlasten sind im Vergleich zu einem Linux-System zu hoch. Ich habe ungefähr 0,40 1 Minute ohne CPU-Verbrauch (0-1%) und selbst wenn dies auf 4 Kerne verteilt ist, entspricht dies immer noch ungefähr 0,10 = 10% CPU-Verbrauch, was nicht korrekt ist. Ich habe jetzt erfahren, dass der durchschnittliche Auslastungsgrad nicht nur die CPU-Nutzung berücksichtigt, sondern auch die Festplatte und das Netzwerk. Ich habe daher versucht, den io wait-Wert zu finden, aber dieser scheint aus irgendeinem Grund auf dem Mac nicht verfügbar zu sein. Ich habe US und SY und ID natürlich im iostat-Tool, aber keine Anzeichen von io wait% (WI genannt, wenn ich mich nicht falsch erinnere).

Alles ist in Ordnung und ich habe die gleichen Lastdurchschnitte auf meinen anderen Macs. Ich möchte hier verstehen, WARUM die Durchschnittswerte auf diese Weise (so hoch) berechnet werden und wie ich sie weiter analysieren kann.

Ich habe gut 2 Stunden zu diesem Thema gegoogelt, aber es wird wenig oder gar nicht darüber gesprochen, irgendwelche Ideen?

Kristian Erik Tigersjäl
quelle
Fragen Sie nach Kernel-Interna und erwähnen Sie nicht , welche Version von OS X Sie ausführen: Keine gute Idee.
Daniel Beck
Entschuldigung, Lion 10.7.2!
Kristian Erik Tigersjäl

Antworten:

13

Die Last ist die durchschnittliche Anzahl ausführbarer Prozesse. man 3 getloadavgsagt:

Die Funktion getloadavg () gibt die Anzahl der Prozesse in der Systemlaufwarteschlange zurück, gemittelt über verschiedene Zeiträume. Bis zu Nelem-Samples werden abgerufen und aufeinanderfolgenden Elementen von loadavg [] zugewiesen.
Das System legt maximal 3 Abtastwerte fest, die Durchschnittswerte der letzten 1, 5 bzw. 15 Minuten darstellen.

Sie können dieselben Informationen auch durch Ausführen abrufen sysctl vm.loadavg.


Unter der Annahme von Mac OS X 10.7.2 getloadavgruft die Funktion diesen Code hier auf (Suche nach dem zweiten Vorkommen von sysctl_loadavg), der im Wesentlichen den aktuellen Wert von zurückgibt averunnable.

Dies wird wiederum hier definiert :

struct loadavg averunnable =
    { {0, 0, 0}, FSCALE };      /* load average, of runnable procs */

Diese Datei definiert auch compute_averunnable, welche den neuen gewichteten Wert von berechnet averunnable.


Die Scheduler-Header-Datei sched.h deklariert sie als externund alle Scheduler-Implementierungen xnu-1699.24.8/osfmk/kern/sched_*.crufen sie regelmäßig über compute_averagesin sched_average.c auf .

Das Argument compute_averunnable, ist sched_nrunin sched_average.c, seinen Wert von sched_run_countin zu bekommen sched.h.

Diese Nummer wird von den Makros geändert sched_run_incrund sched_run_decrausschließlich in der Datei verwendet. Dies sched_prim.csind die Planungsprimitive, die für das Entsperren, Versenden usw. von Threads verantwortlich sind.


Um es noch einmal zusammenzufassen:

Es wird einfach die Anzahl der ausführbaren Threads verwendet, um Lastdurchschnitte in Intervallen von 5 Sekunden zu berechnen.


Obwohl die Systeme völlig unterschiedlich sind, fällt es mir schwer zu glauben, dass Linux immer weniger ausgelastet ist als OS X. Tatsächlich scheint Linux einfach einen anderen Wert zu haben .

Wikipedia zitieren :

Auf modernen UNIX-Systemen variiert die Behandlung des Einfädelns in Bezug auf Lastdurchschnitte. Einige Systeme behandeln Threads als Prozesse für die Berechnung des Lastdurchschnitts: Jeder Thread, der auf die Ausführung wartet, addiert 1 zur Last. Andere Systeme, insbesondere Systeme, die das sogenannte N: M-Threading implementieren, verwenden jedoch andere Strategien, z. B. das genaue Zählen des Prozesses zum Zwecke des Ladens (unabhängig von der Anzahl der Threads) oder das Zählen nur der Threads, die derzeit vom Benutzer verfügbar gemacht werden -thread Scheduler zum Kernel, was von der im Prozess festgelegten Parallelität abhängen kann.

Nach diesem Artikel zu urteilen , verwendet Linux wirklich die Anzahl der Prozesse , die im Gegensatz zu den Threads von XNU ausgeführt werden können.

Da jeder ausführbare Prozess mindestens einen ausführbaren Thread hat, sind die Lastdurchschnittswerte unter OS X unter der Annahme einer äquivalenten Lastdurchschnittsberechnung (die ich nicht überprüft habe) immer mindestens genauso groß, da das Element sie zählt. re basierend auf sind unterschiedlich.

Daniel Beck
quelle
1
Vielen Dank für eine sehr detaillierte und gut formulierte Antwort. Diese Informationen waren anderswo sehr schwer zu finden und ich bin sicher, dass andere nach mir auch danach suchen werden. Außerdem möchte ich mein Bedauern darüber ausdrücken, dass ich in diesem Thread keine Benachrichtigungen über Antworten erhalten habe und so beschäftigt war, dass ich es vergaß, bis ich Zeit hatte, die Dinge noch einmal durchzugehen. Trotzdem war die Antwort genauso aussagekräftig. Vielen Dank!
Kristian Erik Tigersjäl
1
Nach
rogerdpack