10 のプログラミング言語のバージョンにおけるネットワーク ドライバーのパフォーマンスの比較

ドイツの大学の研究者グループ опубликовала 結果 実験その間、10 ギガビット Intel Ixgbe (X10xx) ネットワーク カード用の標準ドライバーの 5 バージョンがさまざまなプログラミング言語で開発されました。 ドライバーはユーザー空間で実行され、C、Rust、Go、C#、Java、OCaml、Haskell、Swift、JavaScript、Python で実装されます。 コードを記述するときは、各言語の特性を考慮して、可能な限り最高のパフォーマンスを達成することが主な焦点でした。 すべてのオプションの機能は同じで、約 1000 行のコードで構成されています。 プロジェクトの開発 広める BSD ライセンスに基づいて。

Rust バージョンのドライバーのパフォーマンスは、C 言語のリファレンス ドライバーに非常に近いことが判明しました。 32パケットのブロックを同時送信する負荷ではRustドライバーに若干劣りましたが、32ブロックあたり28パケット以上のテストではCドライバーとほとんど変わらない速度で、3万処理レベルの性能を発揮しました。 Xeon CPU E1230-2 v3.3 XNUMX GHz を搭載したサーバー上の XNUMX 秒あたりのパケット数。

10 のプログラミング言語のバージョンにおけるネットワーク ドライバーのパフォーマンスの比較

パフォーマンスの点で次のニッチは、Go 言語と C# 言語のドライバーで占められており、かなり近い結果が得られました (Go ドライバーは、最大 16 パケットのブロックを含むテストでは勝ちましたが、16 パケットを超えるテストではわずかに負け始めました)ブロック内)。 ブロックあたり 256 パケットの場合、C# ドライバーのピーク パフォーマンスは 28 秒あたり約 25 万パケット、Go ドライバーは XNUMX 秒あたり約 XNUMX 万パケットでした。

次に、ほぼ近い結果であったのが、
Java、OCaml、および Haskell は、以前に検討されていたオプションよりも明らかに遅れをとっており、12 秒あたり 5 万パケットというバーを克服できませんでした。 Swift および JavaScript ドライバーはさらに大きな遅延を示し、XNUMX 秒あたり XNUMX 万パケットのレベルでストリームを処理できました。

ランキングのトップは、0.14 秒あたり 3.7 万パケットしか処理できなかった Python ドライバーによって決まりました。 Python 実装は、JIT や特定の最適化を行わずにインタープリターの速度を評価するために使用されました (コードは CPython 10 を使用して実行され、PyPy と互換性がありませんでしたが、データ ストレージ構造の最適化によりパフォーマンスが約 XNUMX 倍向上する可能性があることに注意してください) )。

さらに、バッファリングの有効性とガベージ コレクターの影響を示すために、レイテンシ テストが実行されました。 テストでは、各パケットがドライバーによって転送された後の遅延を、送信された正確な時間と比較して測定しました。 依然として C ドライバーと Rust ドライバーがリーダーであり、その結果は 1 秒あたり 20 万パケット (約 20 μs) のフローではほとんど区別がつきませんでした。 Go ドライバーは優れたパフォーマンスを発揮し、リーダーにわずかに遅れをとり、50 μs のレベルに留まりました。 C# ドライバーでは約 XNUMX μs の遅延が発生しました。
最も長い遅延は、JavaScript および Java ドライバーで示されました (遅延は 300 μs を超えました)。

10 のプログラミング言語のバージョンにおけるネットワーク ドライバーのパフォーマンスの比較

この研究は、C よりも高水準の言語でドライバーとオペレーティング システム コンポーネントを開発する可能性を評価するために実施されました。 現在、Linux のメモリ問題の 39 件のうち 40 件はドライバーに関連しているため、より安全な言語を使用し、ドライバーをカーネルからユーザー空間に移動するという問題が発生します。 関連性を維持する メーカーはすでにこの方向で積極的に実験を行っています(たとえば、Google は OS 用の TCP スタックを開発しました) フクシア CloudFlare社のGo言語で 作成した Rust での QUIC プロトコルの実装に伴い、Apple はモバイル デバイス上の TCP スタックをユーザー空間に移動しました)。

作業の過程で、Rust 言語がドライバー開発の最適な候補であるという結論に達しました。 Rust の機能は、C ドライバーと比較して約 2% ~ 10% のパフォーマンス損失を犠牲にして、低レベルのメモリ管理に関連する問題を排除します。 Go と C# は、ガベージ コレクションによるミリ秒未満の遅延が許容される状況でシステム コンポーネントを作成するのにも適していると考えられています。

出所: オープンネット.ru

コメントを追加します