mdadm 10 Far Raid 읽기 속도가 고르지 않습니다.

mdadm 10 Far Raid 읽기 속도가 고르지 않습니다.

bsRAID 10 순차 읽기 속도가 매우 큰 경우 (>100MB, 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개와 분수 스트라이프가 필요하므로 완료하려면 두 개의 읽기 스트라이프가 필요합니다. 직접 IO를 사용할 계획이라면 bs를 스트라이프 크기의 짝수 배수로 유지하는 것이 좋습니다. 일반 애플리케이션도 직접 IO를 사용하지 않지만 캐시를 통과하므로 미리 읽기 값이 충분히 큰지 확인하는 것이 좋습니다( /sys/block/mdxxx/queue ). 배열을 생성할 때 더 작은 블록 크기를 사용하는 것이 좋습니다. 지금은 기본값이 512k인 줄 알았는데 예전에는 64k였는데 왜 늘렸는지는 모르겠습니다.

관련 정보