web-dev-qa-db-ja.com

LinuxでソフトウェアRAIDとLVMを使用する場合、どのIOスケジューラと先読みの設定が優先されますか?

複数のレイヤー(物理ドライブ-> 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が基になるスケジューラーを効果的にオーバーライドしますか?

この質問に答える私の試みでは、これを理解するのに役立つかもしれないスケジューラーとツールに関するいくつかの興味深いデータを掘り出しました:

28
andrew311

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回だけ実行します。

7
stark