Open Source im professionellen Einsatz
Linux-Magazin 05/2003

Überwachung der CPU-Auslastung im Kernel

Prozessor-Schwinger

, ,

Die meisten Programme zur Anzeige der CPU-Auslastung wie Top und Xosview bedienen sich aus dem »/proc«-Dateisystem des Linux-Kernels. Unter bestimmten Umständen liefert diese Schnittstelle jedoch unkorrekte Werte. Das beschriebene Patch behebt das Problem.

589

Der Lehrstuhl für Technische Informatik der Universität Heidelberg entwickelt zurzeit Datenauslesesysteme, von denen einige aus Linux-Clustern mit bis zu 1000 Knoten bestehen werden. Geplant ist ihr Einsatz für ehrgeizige Großexperimente der Elementarteilchen- und Schwerionenphysik

In diesem Rahmen untersucht eine Arbeitsgruppe effiziente Mechanismen der Netzwerkkommunikation, um die Prozessorauslastung beim Übertragen von Daten möglichst gering zu halten. Dabei interessiert besonders der in der vorgegebenen Konstellation minimal mögliche Overhead bei Netzwerkübertragungen unter Benutzung der unmodifizierten Netzwerkkarten-Treiber.

Zu diesem Zweck haben wir, die Autoren dieses Beitrags, ein kleines Kernelmodul entwickelt, das Daten aus einem Programm ohne ein komplexes Protokoll wie TCP/IP über das Netzwerk versendet. Dieses Modul erzeugt unterschiedliche Netzwerklasten, um die CPU-Auslastung in Abhängigkeit von der Datenübertragungsrate zu messen.

Seltsame periodische Schwankungen

Im Verlauf dieser Messungen beobachteten wir jedoch auf einem Dualprozessor-System ein Phänomen: Die Last des Systems schwankte bei prinzipbedingt konstanter Datenübertragungsrate zwischen null Prozent und einem von der Übertragungsrate abhängigen Maximalwert. Das betraf sowohl den Sender als auch den Empfänger der Daten.

Diese Schwankungen traten mit einer Periode auf, die in der Größenordnung von mehreren 100 Sekunden lag. Ein Beispiel für eine derartige Messung zeigt Abbildung 1. Der uns anfänglich nicht erklärbare Effekt trat allerdings nur auf, wenn die Übertragungsrate durch Aufrufe der »usleep«-Funktion auf einen bestimmten Wert gedrosselt wurde, aber nicht bei Nutzung der vollen Netzwerkbandbreite.

Ein ähnliches Verhalten zeigt ein kleines Testprogramm, das außerhalb des Kernels Daten im Speicher per »memcpy« kopiert. Die Rate, mit der es die Daten kopiert, ist dabei ebenfalls über »usleep« auf einen bestimmten Wert geregelt. Aufrufe desselben Programms auf einem System mit einem Uniprozessor-Kernel zeigten dagegen eine kaum messbare CPU-Last (knapp über null Prozent), obwohl 80 MByte/s kopiert wurden.

Wo ist Harvey?

Dadurch angeregt kam in der Arbeitsgruppe der Verdacht auf, dass unsere Programme der Prozessüberwachung des Linux-Kernels ein Schnippchen schlagen und für diese zumindest teilweise unsichtbar sind. Zur Überprüfung des Verdachts entwickelten wir ein Programm, das in einer Endlosschleife abwechselnd rechnet und schläft.

Aufgrund seiner Fähigkeit, vor dem Prozess-Accounting des Standardkernels verborgen zu bleiben, haben wir es Harvey (nach dem Filmklassiker "Mein Freund Harvey") genannt (siehe Listing 1). Die in Zeile 13 beginnende Endlosschleife enthält die beiden Funktionsblöcke zum Rechnen und Schlafen. Während des Rechnens bestimmt Harvey durch wiederholtes Aufrufen von »gettimeofday« die für diesen Block bereits verstrichene Zeit.

Sobald die durch »RUNTIME« festgelegte Zeit abläuft, gibt Harvey durch den Aufruf von »usleep( 0 )« den verbleibenden Rest seiner Zeitscheibe (vergleiche Kasten "Der Scheduler") ab. Abbildung 2 zeigt einen Screenshot von Top, während Harvey läuft. Scheinbar erzeugt Harvey keine Last auf dem System und zeigt somit das gleiche Verhalten wie die anderen Programme.

Da es sehr unwahrscheinlich ist, dass ein Prozess, der 90 Prozent seiner Laufzeit in einer Schleife arbeitet, keine messbare Prozessorlast erzeugt, haben wir die Auslastung mit dem in Listing 2 gezeigten Programm CPUmeter gemessen. Die While-Endlosschleife des Programms bestimmt in der Funktion »get_iterations« die Anzahl von Schleifendurchläufen pro Sekunde. Wird es mit der niedrigsten Priorität gestartet, erhält es vom Scheduler weniger CPU-Zeit, sobald mindestens ein anderer Prozess im System lauffähig ist.

Dadurch ist die Anzahl der in jeder Sekunde abgearbeiteten Iterationen ein Maß für die tatsächliche Auslastung eines Prozessors: Je weniger Iterationen, desto größer ist die Last. Benutzt man nun CPUmeter, zeigt sich, dass Harvey auf dem System eine Last von etwa 90 Prozent erzeugt - wie man es aufgrund des Listings auch erwarten würde.

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Die Reihenfolge zählt

    Die Leistungsentfaltung von Betriebssystemen hängt entscheidend von der Performance und der Strategie des Schedulers ab, der die Prozessliste führt und lauffähigen Prozessen die CPU scheibchenweise zuteilt. Der Scheduler des Kernels 2.6 ist komplett umgeschrieben und erfüllt die Anforderungen in nachweisbar hohem Maße. Timo Hönig

  • Kern-Technik

    Der Linux-Kernel hat auch die Aufgabe, die Prozesse und Threads möglichst gleichmäßig auf die vorhandenen CPU-Cores zu verteilen. Einige Funktionen des Scheduling-API helfen dem Anwendungsprogrammierer dabei, den Kernel entsprechend zu beeinflussen.

  • Kernel-News
  • Kern-Technik

    Android führt mit deutlichem Abstand die Hitparade der Smartphone-Betriebssysteme an. Die Kern-Technik beleuchtet, welche Änderungen Google für den Mobileinsatz am Linux-Kernel vorgenommen hat und was es mit Wakelocks, Binder und dem anonymen Shared Memory auf sich hat.

  • Kern-Technik

    Scheduling ist eine zentrale Aufgabe des Linux-Kernels, der sich dabei um größte Fairness bemüht. Wer aber glaubt, dass damit alle das Gleiche bekommen, der irrt.

comments powered by Disqus

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.