대신 2개의 PCIe NVMe SSD를 raid1 Linux 소프트웨어 RAID로 구성하면 읽기 성능이 향상되므로 읽기 속도가 대략 절반으로 줄어듭니다.
유사한 Linux 소프트웨어 raid1 설정(또한 SSD)에서는 이제 두 개의 미러링된 블록 장치를 읽기에 사용할 수 있으므로 읽기 성능이 향상되는 것을 확인했습니다.
이 성능 문제를 해결하기 위한 잠재적인 원인과 조사 방향은 무엇입니까?
벤치마킹은 fio
4k on /dev/md125
(raid1) /dev/nvme1n1
및 해당 구성원의 읽기를 사용하여 /dev/nvme0n1
수행되었습니다 . 에서 읽는 것보다 읽는 것이 더 빠릅니다 /dev/md125
.
Linux raid1 소프트웨어를 사용하는 다른 사람들도 raid1 읽기로 인한 속도 향상보다는 직관에 반하는 속도 감소에 직면하고 있는 것 같습니다(참조https://serverfault.com/questions/235199/poor-software-raid10-read-performance-on-linux).
/dev/nvme1n1p1
다음은 /dev/nvme0n1p1
동시성 및 기기 내 fio를 사용하는 임의 4k 읽기에 대한 일부 성능 벤치마크 데이터입니다.
fio4k /dev/nvme1n1p1
[...]
read: IOPS=637k, BW=2487MiB/s (2608MB/s)(146GiB/60001msec)
fio4k /dev/nvme0n1p1
read: IOPS=652k, BW=2545MiB/s (2669MB/s)(149GiB/60001msec)
/dev/md125
두 가지 모두를 사용하여 raid1을 생성하는 경우( 부정적인 영향을 피하기 위해 비트맵을 건너뛰는 경우도 있음 /dev/nvme1n1p1
)/dev/nvme0n1p1
mdadm --verbose --create /dev/md/raid1_nvmes --bitmap=none --assume-clean --level=1 --raid-devices=2 /dev/nvme0n1p1 /dev/nvme1n1p1
fio4k /dev/md125
[...]
read: IOPS=337k, BW=1317MiB/s (1381MB/s)(77.2GiB/60001msec)
fio
명령줄 및 기타 정보 업데이트
이는 fio 명령을 사용하여 수행됩니다(변수 BLOCKDEVICE
및는 BLOCKSIZE
위에 제공된 값에 따라 설정되며 BLOCKSIZE=4k
BLOCKDEVICE는 /dev/nvme0n1p1
및/dev/nvme1n1p1
/dev/md/raid1_nvmes
fio --filename="$BLOCKDEVICE" \
--direct=1 \
--rw=randread \
--readonly \
--bs="$BLOCKSIZE" \
--ioengine=libaio \
--iodepth=256 \
--runtime=60 \
--numjobs=4 \
--time_based \
--group_reporting \
--name=iops-test-job \
--direct=1 \
--eta-newline=1 2>&1
내가 실행한 fio 테스트의 결과는 다음과 같습니다.
FIO 벤치마크 직접 블록 장치 테스트/dev/nvme0n1p1
root@ada:/virtualization/machines# cat /usr/local/bin/nn_scripts/nn_fio
#!/bin/bash
set -x
BLOCKDEVICE="$1"
test -b "$BLOCKDEVICE" || { echo "usage: $0 <blockdev> [size_of_io_chunk] [mode: randread]" >&2; exit 1; }
BLOCKSIZE="$2"
test "${BLOCKSIZE%%[kMGT]}" -eq "${BLOCKSIZE%%[kMGT]}" 2>/dev/null || { echo "Run FIO benchmark with block size of 4k"; BLOCKSIZE=4k; }
fio --filename="$BLOCKDEVICE" \
--direct=1 \
--rw=randread \
--readonly \
--bs="$BLOCKSIZE" \
--ioengine=libaio \
--iodepth=256 \
--runtime=60 \
--numjobs=4 \
--time_based \
--group_reporting \
--name=iops-test-job \
--direct=1 \
--eta-newline=1 2>&1 | tee /root/fio.logs/fio.$(basename "$BLOCKDEVICE:").$BLOCKSIZE.$(date -Iseconds)
root@ada:/virtualization/machines# time /usr/local/bin/nn_scripts/nn_fio /dev/nvme0n1p1 [125/294]
+ BLOCKDEVICE=/dev/nvme0n1p1
+ test -b /dev/nvme0n1p1
+ BLOCKSIZE=
+ test '' -eq ''
+ echo 'Run FIO benchmark with block size of 4k'
Run FIO benchmark with block size of 4k
+ BLOCKSIZE=4k
+ fio --filename=/dev/nvme0n1p1 --direct=1 --rw=randread --readonly --bs=4k --ioengine=libaio --iodepth=256 --runtime=60 --numjobs=4 --time_based --grou
p_reporting --name=iops-test-job --direct=1 --eta-newline=1
++ basename /dev/nvme0n1p1:
++ date -Iseconds
+ tee /root/fio.logs/fio.nvme0n1p1:.4k.2021-02-26T11:41:03+01:00
tee: '/root/fio.logs/fio.nvme0n1p1:.4k.2021-02-26T11:41:03+01:00': No such file or directory
iops-test-job: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=256
...
fio-3.12
Starting 4 processes
iops-test-job: (groupid=0, jobs=4): err= 0: pid=28221: Fri Feb 26 11:42:04 2021
read: IOPS=626k, BW=2446MiB/s (2565MB/s)(143GiB/60001msec)
slat (usec): min=2, max=625, avg= 4.59, stdev= 3.06
clat (usec): min=90, max=10696, avg=1629.07, stdev=128.82
lat (usec): min=96, max=10700, avg=1633.79, stdev=129.08
clat percentiles (usec):
| 1.00th=[ 1401], 5.00th=[ 1434], 10.00th=[ 1450], 20.00th=[ 1516],
| 30.00th=[ 1582], 40.00th=[ 1614], 50.00th=[ 1647], 60.00th=[ 1663],
| 70.00th=[ 1696], 80.00th=[ 1729], 90.00th=[ 1762], 95.00th=[ 1811],
| 99.00th=[ 1909], 99.50th=[ 1975], 99.90th=[ 2245], 99.95th=[ 2606],
| 99.99th=[ 3458]
bw ( KiB/s): min=479040, max=691888, per=25.00%, avg=626199.33, stdev=37403.47, samples=477
iops : min=119760, max=172972, avg=156549.78, stdev=9350.91, samples=477
lat (usec) : 100=0.01%, 250=0.01%, 500=0.01%, 750=0.01%, 1000=0.01%
lat (msec) : 2=99.63%, 4=0.36%, 10=0.01%, 20=0.01%
cpu : usr=30.55%, sys=69.28%, ctx=38473, majf=0, minf=6433
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1%
issued rwts: total=37573862,0,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=256
Run status group 0 (all jobs):
READ: bw=2446MiB/s (2565MB/s), 2446MiB/s-2446MiB/s (2565MB/s-2565MB/s), io=143GiB (154GB), run=60001-60001msec
Disk stats (read/write):
nvme0n1: ios=37487591/1001, merge=14/185, ticks=15999825/331, in_queue=24175124, util=100.00%
real 1m0.698s
user 1m20.593s
sys 2m46.774s
raid1에서 fio 벤치마크 테스트/dev/nvme1n1p1
root@ada:/virtualization/machines# time /usr/local/bin/nn_scripts/nn_fio "$(realpath "/dev/md/ada:raid1_nvmes")" [10/330]
+ BLOCKDEVICE=/dev/md127
+ test -b /dev/md127
+ BLOCKSIZE=
+ test '' -eq ''
+ echo 'Run FIO benchmark with block size of 4k'
Run FIO benchmark with block size of 4k
+ BLOCKSIZE=4k
+ fio --filename=/dev/md127 --direct=1 --rw=randread --readonly --bs=4k --ioengine=libaio --iodepth=256 --runtime=60 --numjobs=4 --time_based --group_re
porting --name=iops-test-job --direct=1 --eta-newline=1
++ basename /dev/md127:
++ date -Iseconds
+ tee /root/fio.logs/fio.md127:.4k.2021-02-26T11:49:06+01:00
tee: '/root/fio.logs/fio.md127:.4k.2021-02-26T11:49:06+01:00': No such file or directory
iops-test-job: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=256
...
fio-3.12
Starting 4 processes
iops-test-job: (groupid=0, jobs=4): err= 0: pid=67832: Fri Feb 26 11:50:07 2021
read: IOPS=322k, BW=1257MiB/s (1318MB/s)(73.6GiB/60001msec)
slat (usec): min=3, max=535, avg=10.44, stdev= 5.29
clat (usec): min=47, max=14172, avg=3170.20, stdev=142.99
lat (usec): min=59, max=14179, avg=3180.78, stdev=143.44
clat percentiles (usec):
| 1.00th=[ 2900], 5.00th=[ 2966], 10.00th=[ 2999], 20.00th=[ 3032],
| 30.00th=[ 3097], 40.00th=[ 3163], 50.00th=[ 3195], 60.00th=[ 3228],
| 70.00th=[ 3261], 80.00th=[ 3294], 90.00th=[ 3326], 95.00th=[ 3359],
| 99.00th=[ 3425], 99.50th=[ 3458], 99.90th=[ 3621], 99.95th=[ 3818],
| 99.99th=[ 5866]
bw ( KiB/s): min=293472, max=350408, per=24.99%, avg=321583.77, stdev=11302.31, samples=477
iops : min=73368, max=87602, avg=80395.91, stdev=2825.56, samples=477
lat (usec) : 50=0.01%, 100=0.01%, 250=0.01%, 500=0.01%, 750=0.01%
lat (usec) : 1000=0.01%
lat (msec) : 2=0.01%, 4=99.96%, 10=0.03%, 20=0.01%
cpu : usr=18.54%, sys=81.47%, ctx=342, majf=0, minf=11008
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1%
issued rwts: total=19303258,0,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=256
Run status group 0 (all jobs):
READ: bw=1257MiB/s (1318MB/s), 1257MiB/s-1257MiB/s (1318MB/s-1318MB/s), io=73.6GiB (79.1GB), run=60001-60001msec
Linux 커널 버전은 다음과 같습니다.
root@ada:/virtualization/machines# uname -a
Linux ada 4.19.0-13-amd64 #1 SMP Debian 4.19.160-2 (2020-11-28) x86_64 GNU/Linux
nvmes에서 사용되는 스케줄러는 다음과 같습니다 none
.
root@ada:/virtualization/machines# grep . /sys/block/{md127,nvme0n1,nvme1n1}/queue/scheduler
/sys/block/md127/queue/scheduler:none
/sys/block/nvme0n1/queue/scheduler:[none] mq-deadline
/sys/block/nvme1n1/queue/scheduler:[none] mq-deadline
iostat
a) 직접적인 nvme SSD 성능과 b) nvme SSD의 raid1 성능에 대한 출력 요청이 있었습니다 .
a) 직접적인 NVME 성능
tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device
543201.33 2.1G 1.5M 6.2G 4.6M nvme1n1
20.67 1.3k 1.5M 4.0k 4.6M nvme0n1
25.67 1.3k 1.5M 4.0k 4.6M md127
b) raid1의 성능
tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device
169797.33 663.3M 32.3k 1.9G 97.0k nvme1n1
159573.67 623.3M 32.3k 1.8G 97.0k nvme0n1
329367.33 1.3G 32.0k 3.8G 96.0k md127
c) 병렬 FIO 벤치마크 성능 /dev/nvme1n1p1
및/dev/nvme0n1p1
tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device [0/747]
585589.67 2.2G 20.7M 6.7G 62.0M nvme1n1
405723.00 1.5G 20.7M 4.6G 62.0M nvme0n1
421.67 1.1M 20.7M 3.4M 62.0M md127
관련된 두 개의 NVME 장치는 Samsung Evo 970입니다.
root@ada:/sys/module# nvme list
Node SN Model Namespace Usage Format FW Rev
---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------
/dev/nvme0n1 S4EWNM0NC28151E Samsung SSD 970 EVO Plus 1TB 1 284.89 GB / 1.00 TB 512 B + 0 B 2B2QEXM7
/dev/nvme1n1 S4EWNM0NC28144V Samsung SSD 970 EVO Plus 1TB 1 284.89 GB / 1.00 TB 512 B + 0 B 2B2QEXM7
r
다음을 사용하여 시스템의 PCIe 슬롯에 연결합니다.이 어댑터. lspci의 출력은 다음과 같습니다.
root@ada:/sys/module# lspci -vv | grep -i 'nvme ssd controller'
41:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller SM981/PM981 (prog-if 02 [NVM Express])
Subsystem: Samsung Electronics Co Ltd NVMe SSD Controller SM981/PM981
62:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller SM981/PM981 (prog-if 02 [NVM Express])
Subsystem: Samsung Electronics Co Ltd NVMe SSD Controller SM981/PM981
이 시스템은 512GiB 메모리와 AMD EPYC 7551 32코어 프로세서가 장착된 소켓 2개를 갖춘 DELL 서버 시스템입니다.
벤치마크 중에는 오류가 발생하지 않았습니다 dmesg
.
답변1
(게시 문제에 대해서는 fio
강력히 권장합니다.실행 중인 전체 작업과 fio 버전 번호를 명확하게 게시하세요.이런 것들이 질문에 대한 정답을 얻는지 여부에 큰 영향을 미칠 수 있기 때문입니다)
fio
mdadm의 경우 더 많은 커널 오버헤드가 보고되고 있으며 작업 컨텍스트 전환 수의 차이가 조사되고 있습니다. fio가 일괄 처리를 수행하도록 하는 것이 좋습니다.https://fio.readthedocs.io/en/latest/fio_doc.html#cmdoption-arg-iolength-batch-submit--따라서 각 호출은 한 번에 더 많은 콘텐츠를 제출할 수 있습니다. 또한 /dev/md/raid1_nvmes
이전 명령줄을 사용하여 디스크 통계를 제공하지 못한 경우 fio를 RAID 장치 이름으로 사용할 수 있습니다.
확인해야 할 또 다른 사항은 두 기본 디스크에서 동시에 읽을 때 얻는 속도입니다. 예시 작업은 다음과 같습니다.
fio --direct=1 --rw=randread --readonly --bs=4k --ioengine=libaio \
--iodepth=1024 --runtime=60 --time_based \
--name=solo1 --filename=/dev/nvme0n1p1 --stonewall \
--name=solo2 --filename=/dev/nvme0n1p1 --stonewall \
--name=duo1 --filename=/dev/nvme0n1p1 --name=duo2 --filename=/dev/nvme1n1p1
solo
작업이 자체적으로 실행되고 작업이 동시에 실행되기를 바라지 duo
만 내 fio 작업 형식이 약간 녹슬 수 있으므로 자유롭게 사용하거나 듀엣 실행을 별도의 fio 호출로 분할하세요.
막다른 생각
안타깝게도 mdadm RAID 블록 크기 개념은 이 특정 문제와 관련이 없습니다. RAID 0/4/5/6/10과 달리 mdadm의 RAID 1에는 블록이 없습니다(이 내용 참조).mdadm raid1에 대한 답변과 4k 드라이브의 블록 크기(또는 블록 크기)는 얼마입니까?--chunk
아니면 검색해 보세요mdadm 매뉴얼 페이지).
만약에수행 중인 I/O는 단일 순차 스트림이므로 예상되지 않습니다.mdadm RAID1읽기 속도는 단일 디스크의 읽기 속도보다 빨라야 합니다.. 위에서 언급했듯이 a) 읽기가 무작위이고 b) 여러 병렬 판독기가 발생하기 때문에 이 경우에는 작동하지 않습니다 numjobs
(fio의 경우 전달됨).