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
、2回目の実行で2回目の操作が「終了」しても、LinuxカーネルキャッシュからまだローリングされているI / Oの量がわからないため、何を比較しているのかは不明です。どちらの操作もファイルシステムを使用するため、測定対象が複雑になる可能性があります。一般的な回答者は、コンピュータにどれくらいのRAMがあるかを知らず、カーネルがより多くのバッファ付きI / O用のスペースを作成するためにI / Oフラッシュを開始する必要がある時点もわかりません。
長すぎて通り過ぎる人として、もう少し見なければ絵全体を見ることができないので、具体的に言うことはできません。しかし、あなたが投稿した内容のため、ベンチマークアプローチは不思議に思えます。おそらく予想したものと異なるものをベンチマークしているのでしょうか?