web-dev-qa-db-ja.com

rawデバイスに書き込むときに読み取りを取得する

データの大きなチャンクを、ファイルシステムがない論理ボリュームに移動する必要があります。そうしている間、私はすべての書き込みで読み取りがあることに気づきました。これは、通常のファイルへの書き込みでは見られないものです。次の手順に絞り込みました。

### Creat logical volume
lvremove -f /dev/VolGroup1/data_test
lvcreate -L 100G -n data_test VolGroup1

### Start dumping data
Nohup dd if=/dev/zero of=/dev/VolGroup1/data_test bs=1k count=100M &

### Check IO
iostat -h -d -k -N -y  -j PATH -p /dev/VolGroup1/data_test 10 1


Ddによるその新しいボリュームの多くの読み取りに注意してください

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
dm-9
              56900.60    110719.28    116882.72    1108300    1169996

なぜこれが起こっているのか誰かが知っていますか?基盤となるシステムはSSDのraid10です。

3
Jimmy Hawkins

LVMが最小I/Oサイズを公開しているようです。このI/Oサイズ(の倍数)未満に書き込もうとすると、システムは最初にデルタを読み取って最後のブロックを埋め、次にその内容を更新して最後に再書き込みします。

これに関する正確なドキュメントを正確に特定することはできませんでしたが、 Redhat :でリファレンスを見つけることができました。

LVMは、デバイスの「I/Oヒント」も検出します。デバイスのデータ領域の開始は、sysfsで公開されている「minimum_io_size」または「optimal_io_size」の倍数になります。 'optimal_io_size'が未定義(0)の場合、 'minimum_io_size'が使用されます。 LVMはデフォルトでこれらの「I/Oヒント」を自動的に決定しますが、これはlvm.confの「data_alignment_detection」によって無効にされる場合があります。これを無効にすることはお勧めしません。

いくつかの検索は(ここではdm-1を使用して)につながります:

$ grep ^ /sys/class/block/dm-1/queue/*_io_size
/sys/class/block/dm-1/queue/minimum_io_size:4096
/sys/class/block/dm-1/queue/optimal_io_size:0

したがって、dm-9に置き換えると、たとえば4096と0も得られる場合は、4kのサイズを使用します。または、4096以上の値がある場合は、この大きな値を使用して最適なパフォーマンスを実現します。

したがって、これらの値に従って増加すると、bs=パラメーターの読み取りがゼロになり、書き込み速度が向上します。

2
A.B