Landvermesser

Wer mehrere Prozessoren oder Kerne optimal nutzen will, kommt meist um manuelles Tuning nicht herum. Dabei hilft das Softwarepaket „Portable Hardware Locality“.

vorlesen Druckansicht
Lesezeit: 5 Min.
Von
  • Michael Riepe

Prozessoren mit nur einem Kern findet man heutzutage allenfalls noch in Embedded-Systemen. Schon Intels Desktop-CPU Core i3 besitzt zwei. Die können dank Hyper-Threading je zwei Threads ausführen, sodass das Betriebssystem vier „logische“ Kerne anzeigt. Allerdings teilen die sich Ausführungseinheiten und Cache, sodass Prozesse, die auf demselben physischen Kern laufen, sich gegenseitig behindern.

Clevere Anwendungen können das vermeiden. Wer etwa Windows 7 beim Installieren der monatlichen Updates mit einem CPU-Monitor über die Schulter schaut, stellt fest, dass die Software bei eingeschaltetem Hyper-Threading nur die Hälfte der vorhandenen Prozessorkerne nutzt.

Rechner mit mehreren Prozessoren besitzen heute in der Regel eine NUMA-Architektur (Non-Uniform Memory Access): Jede CPU verwaltet einen Teil des Hauptspeichers. Zugriffe auf das RAM anderer Prozessoren dauern länger als Lesen und Schreiben des lokalen Speichers. Dasselbe gilt gewöhnlich für I/O-Operationen, weil auch die Peripherie dezentral angebunden ist. Läuft ein Prozess auf dem „falschen“ Prozessor, kann sich die Latenz von Zugriffen deutlich erhöhen.

Viele Anwendungen scheren sich um solche Feinheiten jedoch nicht und überlassen es dem Betriebssystem, die Ressourcen zuzuteilen. Das wiederum weiß zwar meist über die Topologie des Rechners Bescheid, aber nicht über die speziellen Anforderungen einzelner Anwendungen. Letzten Endes muss der Nutzer korrigierend eingreifen und Prozessen bestimmte Ressourcen fest zuordnen. Ein beliebtes Mittel ist das Setzen der „CPU Affinity“ einzelner Prozesse oder Threads – unter Windows mit dem Taskmanager, unter Linux/Unix mit den jeweiligen Kommandozeilen-Werkzeugen, die leider von System zu System verschieden sind.

Eine portable Alternative bietet hwloc, ein Nebenprodukt des Open-MPI-Projekts. Das Softwarepaket lässt sich sowohl unter Windows/Cygwin als auch unter Linux, Mac OS X und diversen Unix-Varianten nutzen. Darin enthalten ist das Programm hwloc-bind, das OS-spezifische Tools wie taskset, numactl, pbind oder psrset ersetzt. Lässt das Betriebssystem es zu, kann man mit hwloc-bind nicht nur Prozesse auf eine bestimmte Gruppe physischer oder logischer CPUs dirigieren, sondern auch die Speicherzuteilung beeinflussen. Außerdem lässt sich die Zuordnung – im hwloc-Jargon „binding“ genannt – einzelner Prozesse abfragen. Mit hwloc-ps kann sich der Nutzer die Bindungen aller Prozesse ansehen.

Hilfestellung beim Wählen der Tuning-Parameter leistet das Programm hwloc-ls. Ohne Argumente aufgerufen, gibt es die Topologie des Rechners in Form eines einfachen hierarchischen Listings aus. Auf der obersten Ebene steht der Rechner als Ganzes, darunter – falls vorhanden – die NUMA-Knoten, Prozessorsockel, Caches, CPU-Kerne und „Processing Units“ (SMT-Threads). Außerdem enthält das Listing Speicher- und Cache-Größen. Alle Objekte ab der Knoten-Ebene sind durchnummeriert; wenn die von hwloc verwendete „logische“ Nummerierung von der „physischen“ des Betriebssystems abweicht, sind beide angegeben. Mit der Option –p kann man sich nur Letztere anzeigen lassen.

Unterstützt das Betriebssystem es, zeigt hwloc-ls zusätzlich die I/O-Hierarchie von den PCI(-Express)-Host-Bridges bis hinunter zu Grafikkarten, Festplatten und Netzadaptern. Per USB angebundene Geräte bleiben allerdings unsichtbar. PCI-Geräte sind mit ihrer PCI-ID gekennzeichnet; wer wissen will, was sich dahinter verbirgt, kann mit hwloc-ls –v auf die ausführliche Ansicht umschalten. Sie enthält nicht nur Hersteller- und Produktbezeichnungen, sondern auch zusätzliche Informationen wie die Organisation der Caches – Assoziativität und Länge einer Cache Line – oder die Mac-Adressen der Ethernet-Schnittstellen. Die Option –c ergänzt die Ausgabe um Hexadezimalwerte, die die einzelnen CPUs, Kerne und Threads kennzeichnen und als Argumente für hwloc-bind dienen können. Sie lassen sich jedoch auch mit hwloc-calc berechnen: hwloc-calc core:0 etwa gibt die „Affinity Mask“ für den ersten CPU-Kern aus.

Mit hwloc-ls - -of <format> lassen sich andere Ausgabeformate wählen, darunter das XML-Format, das eine maschinelle Nachbearbeitung erlaubt. hwloc-annotate gestattet es dem Nutzer, den XML-Dateien weitere Informationen in Form von Name-Value-Paaren hinzuzufügen. hwloc-assembler kombiniert mehrere XML-Dateien, etwa die der Knoten eines Clusters, zu einer einzigen. Mit hwloc-ls –i <xmldatei> lässt sich das Ergebnis in einem anderen Format wieder ausgeben. Wem die Ausgabe zu unübersichtlich ist, der kann sie mit einer Reihe von Optionen filtern: - -ignore <typ> etwa entfernt Objekte eines bestimmten Typs, - -no-caches alle CPU-Caches.

Wer eine grafische Übersicht wünscht, kann mit - -of fig eine Eingabedatei für das altehrwürdige Vektorgrafik-Zeichenprogramm Xfig beziehungsweise dessen Windows-Klon WinFIG erzeugen oder mit - -of txt eine ASCII-“Grafik“ erzeugen. Zeitgemäßere Dateiformate wie PDF, PostScript, PNG und SVG generiert das Programm lstopo, das dafür allerdings die Dienste der Grafikbibliothek cairo benötigt (siehe „Alle Links“). Ruft man es ohne Argumente auf, zeigt lstopo die Rechnertopologie auf dem Bildschirm grafisch an; abgesehen davon ist das Programm mit hwloc-ls weitgehend identisch.

Alle Links: www.ix.de/ix1304158 (mr)