Multicore: Optimierungspotential sichtbar machen

Bei schlecht oder fehlerhaft laufenden Multicore-Systemen wird die Lokalisierung eines Problems schon allein durch die Vielzahl von Systeminteraktionen zu einer gewaltigen und frustrierenden Aufgabe. Threads können jederzeit den Core wechseln, mit Threads auf anderen Cores kommunizieren oder mit diesen Ressourcen teilen. Wenn bei mehreren hundert Threads einer plötzlich unerwartet blockiert, gleicht die Suche nach dem Auslöser der Suche nach einer Nadel im Heuhaufen.

Bei schlecht oder fehlerhaft laufenden Multicore-Systemen wird die Lokalisierung eines Problems schon allein durch die Vielzahl von Systeminteraktionen zu einer gewaltigen und frustrierenden Aufgabe. Threads können jederzeit den Core wechseln, mit Threads auf anderen Cores kommunizieren oder mit diesen Ressourcen teilen. Wenn bei mehreren hundert Threads einer plötzlich unerwartet blockiert, gleicht die Suche nach dem Auslöser der Suche nach einer Nadel im Heuhaufen.

INHALT:
Übermäßige Kommunikation zwischen Cores reduzieren
Parallelisierbaren Code finden
Ressourcenkonflikte entdecken und reduzieren
Übermäßige Migration der Threads reduzieren
Ein umfassender Ansatz
Autor

Debugging-Tools für Uniprozessorsysteme wurden nicht entwickelt, um ein solch komplexes Systemverhalten zu analysieren, wie es bei den neuesten Multiprozessorsystemen auftreten kann. Es kann sogar passieren, dass klassische Debugging-Tools ein Problem in einem Teil des Multicore-Systems anzeigen, obwohl es sich tatsächlich an einer anderen Stelle befindet. Hersteller wie QNX Software Systems haben daher eine neue Generation von System- Tracing- und Visualisierungswerkzeugen auf den Markt gebracht. Anders als Tools, die sich auf einzelne Programme und Prozessor-Cores konzentrieren, analysieren diese Werkzeuge das Multicore-System als Ganzes.

Entwickler können damit auch an den Bereichen arbeiten, die bei Parallelverarbeitung und Performance den größten Fortschritt versprechen; z.B. findet der Entwickler in kurzer Zeit heraus, welche Cores zu viel oder zu wenig belastet sind. Er kann übermäßige Interprozesskommunikation zwischen Cores beseitigen, unnötige Migrationen der Threads einschränken und bei Multicore häufig auftretende Ressourcenkonflikte eingrenzen.

Übermäßige Kommunikation zwischen Cores reduzieren

Übermäßige Interprozesskommunikation, kurz IPC, zwischen Cores kann die Performance eines Multicore-Systems mit symmetrischem Multiprocessing reduzieren. Sendet ein Core eine Nachricht zu einem anderen Core, muss diese in den Speicher geschrieben und ein Interrupt an den Empfänger-Core geschickt werden. Der Empfänger-Core muss daraufhin den Interrupt bedienen, den Software- Prozess oder Thread bestimmen, der die Nachricht verarbeitet, und aus dem Speicher auslesen. Tauschen Prozesse häufig Nachrichten zwischen den Cores aus, wie zum Beispiel ein Prozess mit Services für Client-Applikationen, können sie eine erhebliche Menge an Systemkapazität verbrauchen. Trotzdem ist dieser Overhead kleiner als der IPC-Overhead bei asymmetrischen Multicore-Systemen, da diese für IPC typischerweise ein komplettes Netzwerkprotokoll nutzen.

Mit einem System-Tracing-Tool lässt sich dieses Verhalten deutlich einfacher erkennen und analysieren. Der QNX System Profiler zum Beispiel trägt eine enorme Menge an Systeminformationen zusammen, wie Hardware-Interrupts, Kernel-Calls, Scheduling-Vorgänge, Veränderungen bei Thread-Zuständen sowie verschiedene andere Formen der Interprozesskommunikation wie Signale und Nachrichten. Der Nutzen des Tools liegt darin, dass es sämtliche Informationen zur Intercore-Kommunikation liefert und alles andere herausfiltern kann. Auf diese Weise sieht der Entwickler schnell, welche Threads zwischen den Cores kommunizieren und welche Cores eine bestimmte Aufgabe zu welcher Zeit ausführen.

Um das Problem weiter einzugrenzen, bietet das Tool Statistiken, etwa zu den Interrupts pro Thread. Sie helfen zu erkennen, welche Threads übermäßige Intercore-Kommunikation verursachen. Das Tool kann zudem die CPU-Nutzung aus der Systemperspektive, der Prozessperspektive oder anhand der Thread-Prioritäten anzeigen.

Die Systemperspektive zeigt potentielle Problembereiche auf, etwa ob ein Core zu schwach oder zu stark ausgelastet ist. Aus der Prozessperspektive lässt sich feststellen, wie sich die Threads in einem Problembereich verhalten. Über die Thread-Prioritäten ist ersichtlich, ob bestimmte Threads aufgrund der ihnen zugeordneten Priorität zu viel oder zu wenig CPU-Zeit erhalten.

Mit diesen Informationen können Entwickler messen, wie häufig und effizient Intercore-Kommunikation stattfindet, und können entscheiden, wie das Problem zu lösen ist. Eine Möglichkeit ist, enger gekoppelte Prozesse an denselben Core zu binden. Dadurch verringert sich der Overhead der Intercore- Kommunikation, und die leistungshemmende Cache-Überlastung ist aufgehoben. Mit demselben System- Tracing-Tool kann der Entwickler die neue Konfiguration untersuchen und die Effizienzsteigerung messen.