Auf meinem Desktop befindet sich ein kleines Widget, das mir meine aktuelle CPU-Auslastung anzeigt. Es zeigt auch die Verwendung für jeden meiner beiden Kerne.
Ich habe mich immer gefragt, wie die CPU berechnet, wie viel Rechenleistung verbraucht wird. Wenn die CPU bei intensiven Berechnungen aufgehängt ist, wie kann sie (oder was auch immer diese Aktivität handhabt) die Nutzung untersuchen, ohne auch aufgehängt zu werden?
algorithm
performance
cpu
cpu-usage
cpu-architecture
Chris Laplante
quelle
quelle
Antworten:
Die CPU führt die Nutzungsberechnungen nicht selbst durch. Es verfügt möglicherweise über Hardwarefunktionen, die diese Aufgabe erleichtern, ist jedoch hauptsächlich Aufgabe des Betriebssystems. Daher variieren die Details der Implementierungen offensichtlich (insbesondere bei Multicore-Systemen).
Die allgemeine Idee ist zu sehen, wie lange die Warteschlange der Dinge ist, die die CPU tun muss. Das Betriebssystem kann den Scheduler regelmäßig überprüfen, um die Anzahl der zu erledigenden Aufgaben zu bestimmen.
Dies ist eine Linux-Funktion in (aus Wikipedia gerippt), die diese Berechnung durchführt :
Was den zweiten Teil Ihrer Frage betrifft, sind die meisten modernen Betriebssysteme multitaskingfähig . Das bedeutet, dass das Betriebssystem nicht zulässt, dass Programme die gesamte Verarbeitungszeit in Anspruch nehmen und keine für sich selbst haben (es sei denn, Sie lassen dies tun) . Mit anderen Worten, selbst wenn eine Anwendung hängen bleibt , kann das Betriebssystem noch einige Zeit für seine eigene Arbeit stehlen.
quelle
Es gibt eine spezielle Aufgabe, die als Leerlaufaufgabe bezeichnet wird und ausgeführt wird, wenn keine andere Aufgabe ausgeführt werden kann. Die prozentuale Nutzung ist nur der Prozentsatz der Zeit, in der wir die Leerlaufaufgabe nicht ausführen. Das Betriebssystem behält die gesamte Zeit für die Ausführung der Leerlaufaufgabe bei:
Wenn wir zwei Stichproben der laufenden Gesamtzahl von n Sekunden auseinander nehmen, können wir den Prozentsatz der n Sekunden, die für die Ausführung der Leerlaufaufgabe aufgewendet wurden, als (zweite Stichprobe - erste Stichprobe) / n berechnen
Beachten Sie, dass dies vom Betriebssystem und nicht von der CPU ausgeführt wird. Das Konzept einer Aufgabe existiert auf CPU-Ebene nicht! (In der Praxis versetzt die Leerlaufaufgabe den Prozessor mit einem HLT-Befehl in den Ruhezustand, sodass die CPU weiß, wann er nicht verwendet wird.)
Was die zweite Frage betrifft, sind moderne Betriebssysteme präventiv multitaskingfähig, was bedeutet, dass das Betriebssystem jederzeit von Ihrer Aufgabe abweichen kann. Wie stiehlt das Betriebssystem die CPU tatsächlich von Ihrer Aufgabe? Interrupts: http://en.wikipedia.org/wiki/Interrupt
quelle
monitor
/mwait
Anweisungen in den Ruhezustand .hlt
spart etwas Strom, aber nur den flachsten Schlafzustand (C1) . Verwandte: software.intel.com/en-us/blogs/2008/03/27/… / software.intel.com/en-us/blogs/2008/04/29/… . Beachten Sie, dass Skylake es dem Betriebssystem endlich ermöglicht, die volle Kontrolle an die Hardware zu übergeben, zumindest für die Frequenzskalierung, während es aktiv ist, aber möglicherweise entscheidet das Betriebssystem immer noch über den Ruhezustand.Um die CPU-Auslastung zu ermitteln, überprüfen Sie regelmäßig die Gesamtprozesszeit und ermitteln Sie den Unterschied.
Wenn dies beispielsweise die CPU-Zeiten für Prozess 1 sind:
Und dann erhalten Sie sie zwei Sekunden später wieder und sie sind:
Sie subtrahieren die Kernelzeiten (für einen Unterschied von
0.03
) und die Benutzerzeiten (0.61
), addieren sie (0.64
) und dividieren durch die Abtastzeit von 2 Sekunden (0.32
).In den letzten zwei Sekunden verbrauchte der Prozess durchschnittlich 32% der CPU-Zeit.
Die spezifischen Systemaufrufe, die zum Abrufen dieser Informationen erforderlich sind, sind (offensichtlich) auf jeder Plattform unterschiedlich. Unter Windows können Sie GetProcessTimes oder GetSystemTimes verwenden, wenn Sie eine Verknüpfung zur gesamten verwendeten oder nicht genutzten CPU-Zeit wünschen .
quelle
Ein Weg, dies zu tun, ist wie folgt:
Wählen Sie ein Abtastintervall, beispielsweise alle 5 Minuten (300 Sekunden) der tatsächlich verstrichenen Zeit. Sie können dies von bekommen
gettimeofday
.Holen Sie sich die Prozesszeit, die Sie in diesen 300 Sekunden verwendet haben. Sie können den
times()
Anruf verwenden, um dies zu erhalten. Das wäre dienew_process_time - old_process_time
, woold_process_time
ist die Prozesszeit, die Sie aus dem letzten Zeitintervall gespeichert haben.Ihr CPU-Prozentsatz ist dann
(process_time/elapsed_time)*100.0
Sie können einen Alarm einstellen, der Sie alle 300 Sekunden signalisiert, um diese Berechnungen durchzuführen.Ich habe einen Prozess, bei dem ich nicht mehr als einen bestimmten Ziel-CPU-Prozentsatz verwenden möchte. Diese Methode funktioniert ziemlich gut und stimmt gut mit meinem Systemmonitor überein. Wenn wir zu viel CPU verwenden, schlafen wir ein wenig.
quelle
Dies ist mein Grundverständnis, wenn ich ein wenig mit ähnlichem Code in Berührung komme. Programme wie der Task-Manager oder Ihr Widget-Zugriffssystem rufen NtQuerySystemInformation () auf und verwenden die vom Betriebssystem gesammelten Informationen, um auf einfache Weise den Prozentsatz der Zeit zu berechnen, in der eine CPU inaktiv ist oder verwendet wird (in einer Standardzeit). Eine CPU weiß, wann sie inaktiv ist, und kann daher feststellen, wann sie nicht inaktiv ist. Diese Programme können in der Tat verstopfen ... Der Task-Manager meines miesen Laptops friert bei der Berechnung der CPU-Auslastung ständig ein, wenn er zu 100% aufgestockt wird.
Auf der MSDN-Website finden Sie einen coolen Beispielcode, der Funktionsaufrufe zur Berechnung der CPU-Auslastung für eine Reihe von Anweisungen zeigt: http://msdn.microsoft.com/en-us/library/aa364157(VS.85).aspx
Ich glaube, diese Systemaufrufe greifen auf den Kernel-Code zu, der über meinen Rahmen hinausgeht.
quelle
Es gibt verschiedene Möglichkeiten, dies zu tun:
Der Prozessor verwaltet mehrere Zähler, die die Leistung messen. Sie können über die Papi-Schnittstelle darauf zugreifen. Hier ist zum Beispiel eine kurze Einführung: http://blogs.oracle.com/jonh/entry/performance_counter_generic_events
auch: http://www.drdobbs.com/tools/184406109
Der Zähler, den Sie möglicherweise möchten, ist PAPI_TOT_CYC. Dies ist die Anzahl der belegten Zyklen (wenn ich mich richtig erinnere).
quelle
Soweit ich weiß, gibt es einen Riesen
Schleife, die das Betriebssystem hochfährt. Ihr Prozess wird innerhalb dieser Schleife verwaltet. Damit kann externer Code in Blöcken direkt auf dem Prozessor ausgeführt werden. Ohne zu viel zu übertreiben, ist dies eine übermäßige Vereinfachung dessen, was tatsächlich vor sich geht.
quelle
Die CPU wird nicht "aufgehängt", sondern arbeitet einfach mit maximaler Kapazität, was bedeutet, dass sie jede Sekunde so viele Befehle verarbeitet, wie sie physisch in der Lage ist. Der Prozess, der die CPU-Auslastung berechnet, sind einige dieser Anweisungen. Wenn Anwendungen versuchen, Operationen schneller auszuführen, als die CPU in der Lage ist, werden sie einfach verzögert, daher das "Auflegen".
Die Berechnung der CPU-Auslastung basiert auf der insgesamt verfügbaren Auslastung. Wenn eine CPU also zwei Kerne hat und ein Kern 30% und der andere 60% ausgelastet ist, beträgt die Gesamtauslastung 45%. Sie können auch die Verwendung jedes einzelnen Kerns sehen.
quelle