In den Codebasis, auf deren Grundlage der Kernel Linux 7.0 gebildet wird, wurde eine Reihe von Änderungen angenommen, die während eines Stresstests in einem 100-Gigabit-Netzwerk die Verarbeitungseffizienz eingehender UDP-Pakete um 12 % steigern konnten. Die Optimierung wurde durch manuelles Inlining von zwei Funktionen realisiert. Es wird angemerkt, dass die Funktion timecounter_cyc2time() für jedes eingehende Paket aufgerufen werden kann, da moderne Protokolle die Berücksichtigung des Empfangszeitpunkts des Pakets erfordern. Daher unter hoher Last Server kann die Funktion timecounter_cyc2time() mehr als 100 Millionen Mal pro Sekunde aufgerufen werden.
In dieser Situation konnten die automatischen Optimierungen, die vom Compiler angewandt werden, wie FDO (Feedback Directed Optimization), LTO (Link Time Optimization) und PGO (Profile Guided Optimization), den heißen Codeabschnitt nicht erkennen und ignorierten ihn, offenbar weil die Netzwerkadaptertreiber als separate Module bereitgestellt werden. Das manuelle Inline-Deployment der Funktion brachte jedoch erhebliche Leistungsgewinne.
Quelle: opennet.ru
