Linux에서 NVMe 드라이브의 CPU 바인딩 I/O 성능 문제

Linux에서 NVMe 드라이브의 CPU 바인딩 I/O 성능 문제

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(질문에 관련 출력을 포함하고 형식을 지정해 주셔서 감사합니다. 정말 도움이 되었습니다!)

libaioLinux AIO(fio의 ioengine에서 사용)는 직접 I/O를 사용하지 않을 때 차단될 수 있습니다.(포인트 1 참조) 그러나 값이 1에 불과하므로 비동기식 머신에 대한 비용을 지불하고 있지만 그렇게 하지 않기로 선택했기 때문에 iodepth동기식 I/O 엔진(예: )을 사용하는 것이 더 나을 것입니다. pvsync2왜?) . 귀하가 게시한 통계에서 경고 메시지가 나타나는 것 같습니다.다양한 유형위 작업 지연)?

또한 fio두 번째 실행에서 두 번째 작업이 "종료"되면 Linux 커널 캐시에서 여전히 롤링되는 I/O의 양을 알 수 없으므로 무엇을 비교하고 있는지 명확하지 않습니다. 두 작업 모두 파일 시스템을 사용하므로 측정 대상이 복잡해질 수 있습니다. 일반 응답자는 컴퓨터에 RAM이 얼마나 있는지 알 수 없으며 커널이 더 많은 버퍼링된 I/O를 위한 공간을 만들기 위해 I/O 플러시를 시작해야 하는 시점도 알 수 없습니다.

너무 길어서 지나가는 사람으로서 좀 더 보아야 전체 그림을 볼 수 있기 때문에 구체적으로 말할 수는 없습니다. 그러나 귀하가 게시한 내용으로 인해 벤치마킹 접근 방식이 수상쩍게 보입니다. 아마도 예상한 것과 다른 것을 벤치마킹하고 있는 것일까요?

관련 정보