爆速Tokio!Rustで非同期アプリを高速化するための鉄則
Principles for Fast Tokio Applications
Principles for Fast Tokio Applications
Rustの非同期ランタイム「Tokio」を使ったアプリケーションを極限まで高速化するために、エンジニアが守るべき原則を紹介します。単に動くコードを書くだけでなく、パフォーマンスを最大限に引き出すための最適化戦略について深く掘り下げていきます。
Agentic codingの活用法として、最適化のための細かいトレーシングの計測機能を自動で追加できるのはかなり便利だよね。
業界で見てきた重要なサーバーアプリケーションはどれも同じ問題を抱えていて、開発者は驚くけど自分には明らかだったんだ。それは、CPU時間の大部分をepollの入り口や出口、あるいは内部でのワークスティーリングといった「メタ作業」に費やしていること。Tokioでサーバーを書くための原則はあるし、元の投稿で挙げられてるポイントも良いけど、あまり知られていないし簡単に破られすぎてる気がする。
Tokioのチューニング段階にまで達しているなら、ef_vi/DPDKやSPDKを見てみることを検討してみるといいよ。
真のハイパフォーマンスを狙うなら、スレッドのビジースピンやCPUピンニング、それにSPSC/MPSCのリングバッファを使うべきだね。
「Mutexには注意しろ」っていうのは良いアドバイスだけど、Tokioが代替手段として提供している様々なチャンネルについて明示的に触れていないのが意外かな(詳細はここ:https://docs.rs/tokio/latest/tokio/sync/index.html )。ユースケースに合わせて色々な選択肢があるし、runtime機能を有効にしなくても使えるものもある(例えばawaitを使わずに完了を確認したいだけの場合など)。Mutexを使っていてボトルネックになっているケースの半分くらいは、Mutexを使わずにチャンネルを使って必要なデータをタスク間で受け渡すだけで解消できたはずだよ。あと、ちょっと強引なやり方だけど時々使っている裏技として、データのスナップショットを読み取るだけでいいなら、Mutexで変更をブロックし続ける必要はないよね。その場合はデータをクローンしてMutexを解放すれば、データが古くなる可能性はあるけど他の処理を先に進められるよ。
一体Tokioって何だよ?記事の中で一度しか言及されてないし。日本発のプログラミング原則かなにかを期待してたんだけどな。