
背景:私は潜在的なパフォーマンスを向上させることに非常に興味がありますが、io_uring
意味のあるベンチマークを実装するためのC、Linuxカーネル、またはブロックデバイスの内部動作には十分な慣れていません。私は難しい数字を見つけるのではなく、継続的な研究を知らせるためのアーキテクチャの概要だけを探しています。
10 個の 4 バイト整数バッチをファイルに繰り返し追加し、それを同期するプログラムがあると想像してください。バッチの各整数を独自のファイルに追加するモデルに切り替えたいです。つまり、10個のファイルのそれぞれに4バイトのintを書き、すべて同期します。
同期IOを使用する元のソリューションは2つのシステムコール(1つの書き込み+ 1つの同期)を使用しますが、ファイルごとのintアプローチは膨大な20のシステムコール(10個の書き込み+ 10個の同期)を使用します。システムコールの観点から、io_uring
節約効果は膨大です。単一のio_uring
コミットで、20のシステムコールに対応する効果を得ることができます。私が知らないことはどうなりますか?残りwrite
コミットが発生すると、Linuxシステムが拡張されます。
- ほとんどのディスクには、並列書き込みのための一定レベルのハードウェアサポートがありますか?それともSSDは機能しますが、回転ディスクは機能しませんか?
- カーネルが各書き込みに対する往復応答を待つ必要がないように、書き込みは(バスを介して)ディスクに接続されていますか?
- カーネル自体が要求を通過するすべてのシステムコールをキューに追加しますか
io_uring
? - 私が考慮していない他のボトルネックはありますか?
私の考え方が間違っている可能性もある。どんなアドバイスもありがとうございました!
答え1
ほとんどのディスクには、並列書き込みのための一定レベルのハードウェアサポートがありますか?それともSSDは機能しますが、回転ディスクは機能しませんか?
ローテーションディスクでもソリッドステートディスクでも、ほとんどすべてのディスクがこれを行います(回転ディスクにもキャッシュがあるため、少量のデータではそれほど遅くはありません)。安価なUSBキーまたはSDカードは低い同時実行性を達成しますが、ある程度の並列性もあります...単一デバイスへの最大パラレルコマンドの面では、SATAは最大32個まで持つことができ、SCSIは10個から10個の間になる傾向があります。 。 100でNVMeは1000秒に達することができます(仕様では最大値を65536に制限すると思いますが、それほど高いレベルに到達できるデバイスはありません)。
カーネルが各書き込みに対する往復応答を待つ必要がないように、書き込みは(バスを介して)ディスクに接続されていますか?
はい、複数の書き込み(または読み取り)を並列に送信できます。ただし、これが発生するかどうかは、いくつかの要因によって異なります(たとえば、カーネルが効率のためにそれらを組み合わせることができるか、キューをクリアする必要があるため同期が必要になる可能性があります)。
カーネル自体が最終的にio_uringで要求されたすべてのシステムコールをキューに追加しますか?
おそらく。io_uring
ブロックされていない場合、I/O はインラインで完了し、それ以外の場合はキューに追加されます。 ~からio_uringを使用して効率的なIOを実現: 「もっと重要なのは、非ブロック操作の場合、データがインラインで提供されることです」
私が考慮していない他のボトルネックはありますか?
はい。次の利点を実際に見るのに十分な秒数のI / Oを実行しているかどうかはわかりません。io_uring
さらに、頻繁な同期は、頻度と実行方法によって並列性を制限する可能性があります。バッファリングされたI / Oを実行すると、同期中にカーネルはRAMに書き込まれるため、並列性を絞り、可能であればカーネルはRAMから並列に出ます。 (前の項目が完全なリストではないことに注意してください)
(タイトルに質問あり)
io_uringの同時書き込み拡張はどのくらい効果的ですか?
使用するカーネルと I/O の送信方法によっては問題ありません。ここで参考資料とリンクを確認してください「Linuxには本当に非同期ブロックI / Oはありませんか?」への回答。
引用する
- ブロックレイヤーの紹介- ブロックレイヤーを議論する2部作シリーズ
- Linux Block IO:マルチコアシステムへのマルチキューSSDアクセスの導入- Linuxマルチキューアーキテクチャの変更点を説明する論文
- これLinuxブロックI/O層の紹介YouTubeのビデオデモンストレーション