いくつかのホスト用にC++で並行性の高いソフトウェアを作成しており、すべてシステムドライブとして単一のST9500620NSと、データ用のIntel P3700 NVMe Gen3 PCIeSSDカードを備えています。ソフトウェアを調整するためにシステムをさらに理解しようとして、システム(2つのE5-2620 v2 @ 2.10GHz CPU、32GB RAM、CentOS 7.0を実行)を掘り下げて、次のことに驚いた。
[root@sc2u0n0 ~]# cat /sys/block/nvme0n1/queue/scheduler
none
これは、 kernel.orgの公式ドキュメント など、正しいLinux I/Oスケジューラーの選択について私が学んだすべてと矛盾します。
NVMeがブロックの新しい子供であることを理解しているので、今のところ、既存のスケジューラ設定には触れません。しかし、私はインストーラーによって入れられた「なし」について本当に奇妙に感じます。私がより多くの情報を見つけることができるか、あなたの発見を共有することができる場所についていくつかのヒントを持っている人がいれば、私は感謝するでしょう。私はこれまで何も具体的なものを見つけることなくグーグルで何時間も過ごしました。
「none」(別名「noop」)は、このデバイスに使用する正しいスケジューラーです。
I/Oスケジューラは、主に、キューイングが制限された低速のストレージデバイス(単一のメカニカルハードドライブなど)に役立ちます。I/ Oスケジューラの目的は、I/O要求を並べ替えて、より重要な要求を早期に処理することです。内部キューが非常に大きく、サービスが非常に高速なデバイス(PCIe SSDなど)の場合、I/Oスケジューラーは役に立ちません。すべてのリクエストをデバイスにすぐに送信することをお勧めします。
コメントでSanneによって与えられた答えは正しいです:
「その理由は、NVMeがスケジューラーをバイパスするためです。「noop」実装を使用していません。スケジューラーを使用していません。」
noopはnoneと同じではありませんが、noopはブロックマージを実行します(nomergesで無効にしない限り)
Nvmeデバイスを使用する場合、またはコンパイル時またはブート時に「scsi_mod.use_blk_mq = Y」を有効にする場合は、従来のリクエストキューとそれに関連するスケジューラをバイパスします。
Blk-mqのスケジューラーは将来開発される可能性があります。