Server-Tuning durch manuelles Scheduling

Bei SMP-Servern skaliert der Netzwerkdurchsatz nicht besonders gut mit der Anzahl der CPUs. Doch weist man Interrupts und den TCP/IP-Stack manuell einzelnen Prozessoren zu, steigt der Durchsatz um bis zu 30 Prozent.

Ein Netzwerkdurchsatz im Bereich von mehreren Gbit/s treibt selbst aktuelle SMP-Server an ihre Grenzen. Besonders die Netzwerkprotokoll-Stacks der gängigen Betriebssysteme stellen einen limitierenden Faktor dar. Gerade die Implementierungen des TCP/IP-Stacks sind bekannt dafür, dass sie bei Multiprozessorrechnern nicht sehr gut mit der Prozessorzahl skalieren [7, 9]. Dieser Artikel erläutert, wie man durch eine manuelle Zuordnung von Threads, Prozessen und Interrupts an einzelne Prozessoren den Netzwerkdurchsatz signifikant steigern kann.

Die Versuche basieren auf dem TCP/IP-Stack von Redhat Linux 2.4.20. Dabei wird die Auswirkung der set_schedaffinity()-Befehle untersucht, die ab dem Kernel 2.6 offiziell im Mainstream-Linux enthalten sind. Mit dem damit möglichen manuellen Setzen der Prozessoraffinität umgeht man den Scheduler des Betriebssystems. Man zwingt ihn, bestimmte Aufgaben immer der gleichen physikalischen CPU zuzuteilen.

Allein die manuelle Zuweisung der Interrupts von Netzwerkkarten an eine CPU kann den Datendurchsatz um bis zu 25 Prozent steigern. In Kombination mit einer Prozesszuweisung an einzelne CPUs sind Steigerungen um bis zu 30 Prozent möglich. Dieser Artikel zeigt außerdem, wie sich die L2- und L3-Cache-Misses verringern, wenn man die manuelle Prozessoraffinität entsprechend nutzt.