複数のレイヤー(物理ドライブ-> md-> dm-> lvm)の場合、スケジューラー、先読み設定、およびその他のディスク設定はどのように相互作用しますか?
Mdadmで作成されたソフトウェアRAIDデバイス(/ dev/md0)のすべての部分に複数のディスク(/ dev/sda-/ dev/sdd)があるとします。各デバイス(物理ディスクと/ dev/md0を含む)には、IOスケジューラー( そのように変更 )および先読み( blockdevを使用して変更) )。dm(crypto)やLVMなどを投入すると、独自の設定でさらにレイヤーを追加します。
たとえば、物理デバイスに128ブロックの先読みがあり、RAIDに64ブロックの先読みがある場合、/ dev/md0からの読み取りを行うときにこれが受け入れられますか? mdドライバーは64ブロックの読み取りを試みますが、物理デバイスドライバーはそれを128ブロックの読み取りに変換しますか?または、RAID先読みが基礎となるデバイスに「パススルー」し、64ブロックの読み取りになりますか?
同じ種類の質問がスケジューラーにも当てはまりますか? IOスケジューラーの複数のレイヤーとそれらの相互作用について心配する必要がありますか、それとも/ dev/md0が基になるスケジューラーを効果的にオーバーライドしますか?
この質問に答える私の試みでは、これを理解するのに役立つかもしれないスケジューラーとツールに関するいくつかの興味深いデータを掘り出しました:
Md0からの読み取りを行う場合、md0の先読みが使用されます。 md0のコンポーネントであるsdaから読み取りを行った場合、sda設定が使用されます。デバイスマッパーは、I/Oを複数の読み取りと書き込みに分割してRAIDを実行しますが、それはすべて先読みが行われるブロックキャッシュレイヤーの下です。ストレージスタックは次のようになります。
filesystem-O_DIRECTで開いたときにキャッシュをバイパスします
ブロックキャッシュ-先読み、書き込みキャッシュ、スケジューラー
device-mapper-dm、lvm、ソフトウェアRAID、スナップショットなど.
sd-ディスクドライバー
SCSI-エラー処理、デバイスルーティング
ハードウェアドライバー-scsiカード、FCカード、イーサネット
するときに注意してください
dd if=/dev/sda of=foo
sdaをファイルとして読み取るため、ブロックキャッシュを経由します。ディスクに直接移動するには、次のようにします。
dd if=/dev/sda of=foo iflag=direct
I/Oエレベータースケジューラについては、ディスクドライバー(sd)にのみ存在します。/sys/block/mdまたは/ sys/block/dmの下にキューディレクトリはありません。ディスクエレベーターの並べ替えを1回だけ実行します。