bs
RAID 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였는데 왜 늘렸는지는 모르겠습니다.