さまざまなLinux I / O APIがNVMe SSDパフォーマンスベンチマークにどのような影響を与えますか? (libaio対SPDK対io_uring)

さまざまなLinux I / O APIがNVMe SSDパフォーマンスベンチマークにどのような影響を与えますか? (libaio対SPDK対io_uring)

製品仕様に記載されているIOPS、BW、およびレイテンシ値を達成することを目的として、LinuxサーバーでNVMe SSDをベンチマークしています。

私はFIOをワークロードジェネレータとして使用し、最初はlibaioをI / Oエンジンとして使用していましたが、ストレージの世界に深く入り込んで、それが回復不能なほど壊れた古いAPIであることに気づきました。バッファリングされていないアクセスに対してのみ非同期操作を提供するための制限と膨大なシステムコールオーバーヘッド。

これ論文:「最新のストレージAPIについて:libaio、SPDK、io_uringの体系的な研究」は、I / Oコマンドを完了するバックエンドタスクを完全に理解するのに役立ち、デバイス数とコア数をスキャンして3つを比較しました(ソフトウェア)キューの深さ。ただし、アプリケーション開発の範囲を超えているため、ジョブ数(他のワーカー/プロセスで動作)、スレッド、さまざまなブロックサイズ、テストタイプ(seq / random R / W)などの一部のパラメータは解決されません。 、これは数字に深刻な影響を与えます。

私の質問は:すべてのライブラリがSSDを飽和させることができます(例:仕様に記載されている数字を提供する)。それでは、ベンチマークに特定のライブラリを使用できますか?ここでベンチマークとは、さまざまな構成(シングルコア/マルチコア、シングル/マルチスレッド、R / Wの組み合わせなど)で最大スループットと最小レイテンシを達成するためのプロファイリング方法を意味します。そうでなければ、libaioのような古い技術は、最新のデバイス速度と決して一致することはできず、もはや使用すべきではないことを意味します(OSレベルのボトルネックを使用してデバイス速度を定義することは不公平であるため)。

ベンチマークは、デバイスをベンチマークするアプリケーションでも使用されるAPIを介してのみ可能だと思います。ただし、ハードウェアデバイスのベンチマークは、アプリケーションのプロパティではなく、無関係なオペレーティングシステムの操作の影響を受けてはいけないため、これは直観に反しているようです。また、通常の同期I / Oと比較して、タスクの各段階で遅延時間のオーバーヘッドを見つける方法も知りたいです。

私はここにある内容が文書化されていないと思い、現場で経験のある人からより深い理解と考えを得たいと思います。ありがとうございます!

ベストアンサー1

私の質問は:すべてのライブラリがSSDを飽和させることができます(例:仕様に記載されている数字を提供する)。

io_uringオーバーヘッドが少ないため、速度が速くなります。ただし、CPUが十分に高速である場合、libaioSSDは飽和状態になる可能性があります。

私のテスト
-ioengine=libaio -numjobs=1::

   iops        : min=286708, max=386670, avg=381760.92, stdev=13237.78, samples=59

-ioengine=io_uring -numjobs=1:

   iops        : min=399008, max=414024, avg=409571.12, stdev=2658.33, samples=59

(+7%)

-ioengine=libaio -numjobs=2:

   iops        : min=779822, max=814588, avg=805774.92, stdev=2274.38, samples=118

-ioengine=io_uring -numjobs=2:

   iops        : min=438596, max=853962, avg=810650.24, stdev=38096.63, samples=118

(差は1%未満)

-ioengine=libaio -numjobs=4:

   iops        : min=843282, max=1160188, avg=1131725.17, stdev=12340.14, samples=236

-ioengine=io_uring -numjobs=4:

   iops        : min=1031955, max=1163986, avg=1140789.00, stdev=5196.52, samples=236

(やはり1%未満の差)

さらに増やしてもnumjobs何の変化もなく、SSDがすでに飽和しているようです。

fio完全なコマンドライン:

fio -ioengine=XXX -direct=1 -name=test -bs=4k -iodepth=32 -rw=randread -runtime=30 -filename=/dev/nvmeYYY -numjobs=ZZZ -group_reporting

SSDはSamsung pm9a3です。

おすすめ記事