Leistungsvergleich des Netzwerktreibers in Varianten auf 10 Programmiersprachen

Eine Gruppe von Forschern aus deutschen UniversitĂ€ten veröffentlicht Ergebnisse Experiment, bei dem auf verschiedenen Programmiersprachen 10 Varianten eines typischen Treibers fĂŒr 10-Gigabit-Netzwerkkarten von Intel Ixgbe (X5xx) entwickelt wurden. Der Treiber arbeitet im Benutzermodus und ist in den Sprachen C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript und Python implementiert. Bei der Erstellung des Codes lag der Fokus darauf, die maximale mögliche Leistung unter BerĂŒcksichtigung der Besonderheiten jeder Sprache zu erzielen. Funktional sind alle Varianten identisch und bestehen aus etwa 1000 Zeilen Code. Die Ergebnisse des Projekts unter der freien Lizenz Apache 2.0 verbreitet. unter der BSD-Lizenz stehen.

Die Treibervariante in der Sprache Rust erwies sich in Bezug auf die Leistung als sehr nah am Referenztreiber in C. Bei einer Belastung mit gleichzeitigen Sendungen von Blöcken mit 32 Paketen lag der Rust-Treiber etwas zurĂŒck, doch in Tests mit mehr als 32 Paketen pro Block unterschied er sich in Bezug auf die Geschwindigkeit praktisch nicht vom Treiber in C und zeigte eine Leistung auf dem Niveau von 28 Millionen Paketen pro Sekunde auf einem Server mit einem CPU Xeon E3-1230 v2 3,3 GHz.

Leistungsvergleich des Netzwerktreibers in Varianten auf 10 Programmiersprachen

Die nÀchste Leistungsnische wurde von den Treibern in Go und C# eingenommen, die vergleichbare Ergebnisse zeigten (der Treiber in Go gewann in Tests mit Blöcken, die bis zu 16 Pakete enthielten, und verlor leicht in Tests mit mehr als 16 Paketen pro Block). Bei 256 Paketen im Block betrug die Spitzenleistung des Treibers in C# etwa 28 Millionen Pakete pro Sekunde, wÀhrend der Treiber in Go etwa 25 Millionen Pakete pro Sekunde verzeichnete.

Darauf folgten Treiber in
Java, OCaml und Haskell mit bereits deutlich schlechteren Ergebnissen, die die Grenze von 12 Millionen Paketen pro Sekunde nicht ĂŒberschreiten konnten. Noch schlechter schnitten die Treiber in Swift und JavaScript ab, die Ströme auf einem Niveau von 5 Millionen Paketen pro Sekunde verarbeiten konnten.

Den Rang schloss der Treiber in Python ab, der nur 0,14 Millionen Pakete pro Sekunde verarbeiten konnte. Die Implementierung in Python wurde verwendet, um die Geschwindigkeit von Interpretern ohne JIT und ohne spezifische Optimierungen zu bewerten (der Code wurde mit CPython 3.7 ausgefĂŒhrt und war nicht mit PyPy kompatibel, jedoch wird angemerkt, dass eine Optimierung der Datenspeicherstrukturen die Leistung etwa um das Zehnfache hĂ€tte steigern können).

ZusĂ€tzlich wurden Tests zur Verzögerungszeit durchgefĂŒhrt, die die Effizienz der Pufferung und den Einfluss des Garbage Collectors zeigten. Bei den Tests wurde die Verzögerung nach der Weiterleitung jedes Pakets durch den Treiber im Vergleich zu der genau bekannten Sendeszeit gemessen. An der Spitze standen nach wie vor die Treiber in C und Rust, deren Ergebnisse praktisch nicht von dem fĂŒr einen Datenstrom von 1 Million Paketen pro Sekunde (ungefĂ€hr 20 ”s) zu unterscheiden waren. Der Treiber in Go zeigte ebenfalls gute Ergebnisse und lag nur geringfĂŒgig hinter den Spitzenreitern, ebenfalls bei etwa 20 ”s. Der Treiber in C# wies Verzögerungen von etwa 50 ”s auf.
Die grĂ¶ĂŸten Verzögerungen verzeichneten die Treiber in JavaScript und Java (Verzögerungen ĂŒber 300 ”s).

Leistungsvergleich des Netzwerktreibers in Varianten auf 10 Programmiersprachen

Die Studie wurde durchgefĂŒhrt, um die Möglichkeit der Entwicklung von Treibern und Betriebssystemkomponenten in Programmiersprachen von höherem Niveau als C zu bewerten. Derzeit entfallen 39 der 40 Probleme im Zusammenhang mit dem Speicher in Linux auf Treiber, weshalb die Fragen zur Verwendung einer sichereren Sprache und zur Verlagerung von Treibern aus dem Kernel in den Benutzermodus weiterhin aktuell sind und die Hersteller bereits aktiv in diesem Bereich experimentieren (zum Beispiel hat Google einen TCP-Stack fĂŒr das Betriebssystem Fuchsia in der Programmiersprache Go entwickelt, die Firma CloudFlare hat eine QUIC-Protokoll-Implementierung in Rust erstellt, und die Firma Apple hat den TCP-Stack auf mobilen GerĂ€ten in den Benutzermodus verlegt).

Im Verlauf der durchgefĂŒhrten Arbeit wurde der Schluss gezogen, dass die Sprache Rust der beste Kandidat fĂŒr die Entwicklung von Treibern ist. Die in Rust bereitgestellten Möglichkeiten erlauben es, die Probleme, die durch die niedrigstufige Speicherverwaltung entstehen, zu vermeiden, wobei die Leistung um etwa 2 % bis 10 % im Vergleich zu Treibern in C reduziert wird. Die Sprachen Go und C# werden ebenfalls als geeignet fĂŒr die Erstellung von Systemkomponenten angesehen, in Situationen, in denen Verzögerungen im Millisekundenbereich, die durch die Verwendung eines Garbage Collectors verursacht werden, akzeptabel sind.

Quelle: opennet.ru

60GB SSD 8Gb DDR4