mdadm 10 Far Raid 読み取り速度が不均一です。

mdadm 10 Far Raid 読み取り速度が不均一です。

bsRAID 10順次読み取り速度が非常に大きい場合(> 100 MB、ddパラメータ)にのみ増加するのはなぜですか?急襲を行うには:

/dev/md127:
Version : 1.2
Raid Level : raid10
        Array Size : 46875009024 (44703.49 GiB 48000.01 GB)
     Used Dev Size : 11718752256 (11175.87 GiB 12000.00 GB)
      Raid Devices : 8
     Total Devices : 8
       Persistence : Superblock is persistent

     Intent Bitmap : Internal

             State : clean
    Active Devices : 8
   Working Devices : 8
    Failed Devices : 0
     Spare Devices : 0

            Layout : far=2
        Chunk Size : 1024K

Consistency Policy : bitmap

順次読み取り速度は、少なくとも100MB * n_drives = 800 + MB / secになると予想されます。しかし:

dd if=/dev/md127 of=/dev/null bs=10240k count=1000 iflag=direct
1000+0 records in
1000+0 records out
10485760000 bytes (10 GB, 9.8 GiB) copied, 14.2918 s, 734 MB/s

iostat -zxs 1
Device             tps      kB/s    rqm/s   await  areq-sz  aqu-sz  %util
md127          2880.00 737280.00     0.00    0.00   256.00    0.00   0.00
sda             360.00  92160.00     0.00    5.21   256.00    1.24  70.80
sdb             360.00  92160.00     0.00    5.05   256.00    1.14  74.80
sdc             367.00  93952.00     0.00    5.25   256.00    1.26  76.80
sdd             368.00  94208.00     0.00    6.46   256.00    1.70  80.80
sde             360.00  92160.00     0.00    5.53   256.00    1.31  75.60
sdf             362.00  92672.00     0.00    6.15   256.00    1.54  72.40
sdg             364.00  93184.00     0.00    5.18   256.00    1.24  73.20
sdh             364.00  93184.00     0.00    5.73   256.00    1.40  70.40

単一ドライブをテストする場合:

dd if=/dev/sda of=/dev/null bs=1024k count=1000 iflag=direct
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 4.25743 s, 246 MB/s

iostat -xs /dev/sda 1
Device             tps      kB/s    rqm/s   await  areq-sz  aqu-sz  %util
sda             868.00 222208.00     0.00    2.79   256.00    0.70 100.00

非常に大きく設定されている場合にのみ、bs単一速度 *n_drives と同様の読み取り速度が得られます。

dd if=/dev/md127 of=/dev/null bs=1024000k count=30 iflag=direct
30+0 records in
30+0 records out
31457280000 bytes (31 GB, 29 GiB) copied, 16.2737 s, 1.9 GB/s

iostat -dxs 1
Device             tps      kB/s    rqm/s   await  areq-sz  aqu-sz  %util
md127         10115.00 2341348.00     0.00    0.00   231.47    0.00   0.00
sda            1077.00 259848.00   187.00  153.82   241.27  163.51  95.20
sdb            1077.00 260612.00   197.00  162.94   241.98  173.33  99.20
sdc            1083.00 262412.00   197.00  160.82   242.30  171.96  98.40
sdd            1067.00 258568.00   195.00  170.78   242.33  180.09 100.00
sde            1086.00 262416.00   195.00  159.38   241.64  170.90  98.40
sdf            1077.00 260360.00   189.00  155.88   241.75  165.71  96.40
sdg            1073.00 259076.00   197.00  160.96   241.45  170.56  98.00
sdh            1085.00 260872.00   191.00  163.61   240.44  175.34  99.60

私のワークロードはほとんど順次読み取りで構成されていますが、アプリケーションがそれほど大きなIO読み取りを実行するかどうかはわかりません。

テストはブロックデバイスで直接行われたので、これは問題がFSにないことを意味します。 areq-sqすべてのケースでほぼ同じですが、%util攻撃の場合は低いです。これは、攻撃者が要求を生成するのに問題があることを意味します(しかし、aqu-szは攻撃者と比較して巨大です。なぜですか?)原因を見つける方法は?

DISTRIB_DESCRIPTION="Ubuntu 20.04.2 LTS" Linux 5.4.0-67-generic #75-Ubuntu SMP 金曜日 2月 19日 18:03:38 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

cat /sys/block/md127/queue/scheduler
none

編集する 私は〜だった間違った>100MB私の最初の行について。 私はソートされた読み取りバリアントを確認するために別のbsでいくつかの実験を行いました。

dd if=/dev/md127 of=/dev/null bs=8M count=3000 iflag=direct
25165824000 bytes (25 GB, 23 GiB) copied, 33.1877 s, 758 MB/s

dd if=/dev/md127 of=/dev/null bs=16M count=300 iflag=direct
5033164800 bytes (5.0 GB, 4.7 GiB) copied, 4.71832 s, 1.1 GB/s

dd if=/dev/md127 of=/dev/null bs=18M count=1000 iflag=direct
18874368000 bytes (19 GB, 18 GiB) copied, 18.4601 s, 1.0 GB/s

dd if=/dev/md127 of=/dev/null bs=20M count=500 iflag=direct
10485760000 bytes (10 GB, 9.8 GiB) copied, 10.0867 s, 1.0 GB/s

dd if=/dev/md127 of=/dev/null bs=32M count=300 iflag=direct
10066329600 bytes (10 GB, 9.4 GiB) copied, 7.29756 s, 1.4 GB/s

dd if=/dev/md127 of=/dev/null bs=128M count=100 iflag=direct
13421772800 bytes (13 GB, 12 GiB) copied, 8.27345 s, 1.6 GB/s

dd if=/dev/md127 of=/dev/null bs=256M count=100 iflag=direct
26843545600 bytes (27 GB, 25 GiB) copied, 15.5701 s, 1.7 GB/s

dd if=/dev/md127 of=/dev/null bs=512M count=100 iflag=direct
53687091200 bytes (54 GB, 50 GiB) copied, 28.9437 s, 1.9 GB/s

dd if=/dev/md127 of=/dev/null bs=1G count=32 iflag=direct
34359738368 bytes (34 GB, 32 GiB) copied, 18.36 s, 1.9 GB/s

bsによって(例えば256Mから512Mへ)、速度が増加する理由はまだ理解するのが難しいですがbs=32M

答え1

ブロックサイズは1Mなので、ドライブが8個ある場合、ストライプサイズは8Mです。 10Mの直接IO読み取りを実行する場合は、1つと分数ストライプが必要なため、完了するには2つの読み取りストライプが必要です。直接IOを使用する予定の場合は、bsをストライプサイズの偶数倍に保つことをお勧めします。通常のアプリケーションも直接IOを使用しませんが、キャッシュを通過するため、先読み値が十分に大きいことを確認することをお勧めします( /sys/block/mdxxx/queue )。配列を作成するときは、より小さいブロックサイズを使用することをお勧めします。今はデフォルト値が512kだと思っていましたが、以前は64kでしたが、なぜ増やしたのかわかりません。

関連情報