- この記事は、Rust コミュニティにおけるマルチスレッド実行器の利用をめぐる議論を扱っており、これはタスクをバランスよく分配するために work-stealing を行う async ランタイムです。
- 一部の Rust ユーザーは、「thread-per-core」という代替アーキテクチャを提唱しており、こちらのほうが高性能で実装も容易だとしています。
- 「thread-per-core」という用語は誤解を招きやすいものです。すべてのマルチスレッド実行器は thread-per-core であり、コアごとに 1 つずつ OS スレッドを生成し、その上でタスクをスケジューリングします。
- Thread-per-core は 3 つのアイデアを組み合わせたものです。すなわち、ユーザー空間での並行処理、I/O を非同期化してスレッドのブロッキングを避けること、そして CPU コア間でデータを分割して同期コストと CPU キャッシュ間のデータ移動をなくすことです。
- この議論の中心は主に 3 つ目のポイントであり、async Rust を使えば最初の 2 つの要件は満たせます。
- Thread-per-core アーキテクチャでは、2 つの最適化を行えます。すなわち、スレッド間でタスクを steal することと、共有する状態を可能な限り少なくすることです。
- Work-stealing は、すべてのスレッドが常に仕事を持てるようにすることで tail latency を改善しますが、実装が難しく、同期コストやキャッシュミスを引き起こす可能性があります。
- Share-nothing は、データを単一の CPU コアに属するより高速なキャッシュ内に保持することで tail latency を改善しますが、複数のパーティションにまたがって状態を変更する必要がある複雑なアプリケーションでは実装が難しい場合があります。
- この記事は、共有状態を使うシステムでは、work-stealing が高負荷時の CPU 使用率を改善できる可能性があると示唆しています。
1件のコメント
Hacker Newsの意見
Send + Sync + 'staticが要求されることも含まれ、一部の人はそれを負担に感じています。Sendbound は、executor スレッド間でのタスク移動を可能にするための要件であり、Rust async システムの欠点のように見えます。asyncの使用は多くの Rust プログラムにとって早すぎる最適化と見なされます。Send、Sync、'staticのような追加の開発者制約をもたらします。