PCIe gen2 x4 속도의 NVMe 드라이브가 있는 NVIDIA Jetson TX2 시스템이 있습니다. 시스템에서 Linux 4.9 커널을 실행하고 있는데 쓰기 성능 문제가 발생했습니다. 내 목표는 약 260MB/s의 속도로 순차 데이터를 디스크에 쓰는 것입니다. 나는 하드웨어가 이것을 지원해야 한다고 믿습니다. fio
벤치마킹을 위해
fio --name=seq_write --filename=testfile --size=10G --bs=2m --rw=write --time_based --runtime=20 --direct=1 --ioengine=libaio --iodepth=1 --output=seq-write-direct.out
버퍼를 우회할 때 쓰기 속도는 약 870MB/s인 것을 알 수 있습니다.
seq_write: (g=0): rw=write, bs=(R) 2048KiB-2048KiB, (W) 2048KiB-2048KiB, (T) 2048KiB-2048KiB, ioengine=libaio, iodepth=1
fio-3.1
Starting 1 process
seq_write: (groupid=0, jobs=1): err= 0: pid=3639: Tue Mar 9 17:28:02 2021
write: IOPS=414, BW=829MiB/s (870MB/s)(16.2GiB/20001msec)
slat (usec): min=319, max=3021, avg=1187.86, stdev=754.71
clat (usec): min=570, max=3826, avg=1077.90, stdev=139.89
lat (usec): min=1624, max=4674, avg=2266.94, stdev=645.00
clat percentiles (usec):
| 1.00th=[ 709], 5.00th=[ 799], 10.00th=[ 807], 20.00th=[ 1012],
| 30.00th=[ 1074], 40.00th=[ 1106], 50.00th=[ 1123], 60.00th=[ 1123],
| 70.00th=[ 1123], 80.00th=[ 1156], 90.00th=[ 1172], 95.00th=[ 1287],
| 99.00th=[ 1303], 99.50th=[ 1303], 99.90th=[ 1352], 99.95th=[ 1434],
| 99.99th=[ 3818]
bw ( KiB/s): min=614400, max=1093632, per=100.00%, avg=889105.49, stdev=204457.74, samples=37
iops : min= 300, max= 534, avg=434.08, stdev=99.89, samples=37
lat (usec) : 750=1.75%, 1000=15.58%
lat (msec) : 2=82.63%, 4=0.05%
cpu : usr=6.88%, sys=47.06%, ctx=9040, majf=0, minf=22
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.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.0%
issued rwt: total=0,8295,0, short=0,0,0, dropped=0,0,0
latency : target=0, window=0, percentile=100.00%, depth=1
Run status group 0 (all jobs):
WRITE: bw=829MiB/s (870MB/s), 829MiB/s-829MiB/s (870MB/s-870MB/s), io=16.2GiB (17.4GB), run=20001-20001msec
Disk stats (read/write):
nvme0n1: ios=0/16381, merge=0/9, ticks=0/23476, in_queue=23460, util=73.80%
직접 쓰기를 끄면 매우 다르게 보입니다.
fio --name=seq_write --filename=testfile --size=10G --bs=2m --rw=write --time_based --runtime=20 --direct=0 --ioengine=libaio --iodepth=1 --output=seq-write.out
seq_write: (g=0): rw=write, bs=(R) 2048KiB-2048KiB, (W) 2048KiB-2048KiB, (T) 2048KiB-2048KiB, ioengine=libaio, iodepth=1
fio-3.1
Starting 1 process
seq_write: (groupid=0, jobs=1): err= 0: pid=1461: Tue Mar 9 17:25:12 2021
write: IOPS=130, BW=260MiB/s (273MB/s)(5206MiB/20003msec)
slat (msec): min=6, max=108, avg= 7.19, stdev= 2.06
clat (usec): min=14, max=346, avg=20.14, stdev= 7.23
lat (msec): min=6, max=108, avg= 7.22, stdev= 2.06
clat percentiles (usec):
| 1.00th=[ 16], 5.00th=[ 19], 10.00th=[ 19], 20.00th=[ 20],
| 30.00th=[ 20], 40.00th=[ 20], 50.00th=[ 21], 60.00th=[ 21],
| 70.00th=[ 21], 80.00th=[ 21], 90.00th=[ 21], 95.00th=[ 22],
| 99.00th=[ 24], 99.50th=[ 37], 99.90th=[ 65], 99.95th=[ 122],
| 99.99th=[ 347]
bw ( KiB/s): min=176128, max=294912, per=100.00%, avg=280496.89, stdev=21426.33, samples=38
iops : min= 86, max= 144, avg=136.95, stdev=10.47, samples=38
lat (usec) : 20=50.33%, 50=49.29%, 100=0.31%, 250=0.04%, 500=0.04%
cpu : usr=1.90%, sys=96.59%, ctx=810, majf=0, minf=20
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.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.0%
issued rwt: total=0,2603,0, short=0,0,0, dropped=0,0,0
latency : target=0, window=0, percentile=100.00%, depth=1
Run status group 0 (all jobs):
WRITE: bw=260MiB/s (273MB/s), 260MiB/s-260MiB/s (273MB/s-273MB/s), io=5206MiB (5459MB), run=20003-20003msec
Disk stats (read/write):
nvme0n1: ios=0/4558, merge=0/6, ticks=0/286996, in_queue=286996, util=15.04%
성능은 약 260MB/s로 떨어집니다. 이 하락은 CPU와 관련된 것으로 보입니다. 쓰기 성능을 향상시키기 위해 커널 측에서 할 수 있는 일이 있는지 궁금합니다. NVIDIA 포럼에 비슷한 질문을 올렸습니다.TX1과 TX2 사이의 성능 저하.
답변1
fio
(질문에 관련 출력을 포함하고 형식을 지정해 주셔서 감사합니다. 정말 도움이 되었습니다!)
libaio
Linux AIO(fio의 ioengine에서 사용)는 직접 I/O를 사용하지 않을 때 차단될 수 있습니다.(포인트 1 참조) 그러나 값이 1에 불과하므로 비동기식 머신에 대한 비용을 지불하고 있지만 그렇게 하지 않기로 선택했기 때문에 iodepth
동기식 I/O 엔진(예: )을 사용하는 것이 더 나을 것입니다. pvsync2
왜?) . 귀하가 게시한 통계에서 경고 메시지가 나타나는 것 같습니다.다양한 유형위 작업 지연)?
또한 fio
두 번째 실행에서 두 번째 작업이 "종료"되면 Linux 커널 캐시에서 여전히 롤링되는 I/O의 양을 알 수 없으므로 무엇을 비교하고 있는지 명확하지 않습니다. 두 작업 모두 파일 시스템을 사용하므로 측정 대상이 복잡해질 수 있습니다. 일반 응답자는 컴퓨터에 RAM이 얼마나 있는지 알 수 없으며 커널이 더 많은 버퍼링된 I/O를 위한 공간을 만들기 위해 I/O 플러시를 시작해야 하는 시점도 알 수 없습니다.
너무 길어서 지나가는 사람으로서 좀 더 보아야 전체 그림을 볼 수 있기 때문에 구체적으로 말할 수는 없습니다. 그러나 귀하가 게시한 내용으로 인해 벤치마킹 접근 방식이 수상쩍게 보입니다. 아마도 예상한 것과 다른 것을 벤치마킹하고 있는 것일까요?