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にすぎないので、非同期マシンのコストを支払っていますが、そうしないことを選択したので、同期iodepthI / Oエンジン(例:)を使用する方が良いでしょう。pvsync2なぜ?) 。あなたが投稿した統計から警告メッセージが表示されるようです。様々なタイプ上記の作業遅延)?

またfio、2回目の実行で2回目の操作が「終了」しても、LinuxカーネルキャッシュからまだローリングされているI / Oの量がわからないため、何を比較しているのかは不明です。どちらの操作もファイルシステムを使用するため、測定対象が複雑になる可能性があります。一般的な回答者は、コンピュータにどれくらいのRAMがあるかを知らず、カーネルがより多くのバッファ付きI / O用のスペースを作成するためにI / Oフラッシュを開始する必要がある時点もわかりません。

長すぎて通り過ぎる人として、もう少し見なければ絵全体を見ることができないので、具体的に言うことはできません。しかし、あなたが投稿した内容のため、ベンチマークアプローチは不思議に思えます。おそらく予想したものと異なるものをベンチマークしているのでしょうか?

関連情報