fio と mmap を ioengine として使用して NVME のスキャン書き込みを測定する場合、ディスク統計に多くの読み取り操作が表示されるのはなぜですか?

fio と mmap を ioengine として使用して NVME のスキャン書き込みを測定する場合、ディスク統計に多くの読み取り操作が表示されるのはなぜですか?

私のFIOの設定とレポートは次のとおりです。

# cat fio-write.fio 
[global]
name=fio-seq-writes
filename=test
rw=write
bs=1M
direct=0
numjobs=1
[file1]
size=1G
ioengine=mmap
iodepth=1

# fio --version
fio-3.30
# fio fio-write.fio 
file1: (g=0): rw=write, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB, (T) 1024KiB-1024KiB, ioengine=mmap, iodepth=1
fio-3.30
Starting 1 process
Jobs: 1 (f=1): [W(1)][-.-%][w=373MiB/s][w=373 IOPS][eta 00m:00s]
file1: (groupid=0, jobs=1): err= 0: pid=421: Sun Nov 14 21:12:09 2021
  write: IOPS=330, BW=330MiB/s (346MB/s)(1024MiB/3102msec); 0 zone resets
    clat (usec): min=2118, max=11668, avg=2598.40, stdev=1333.02
     lat (usec): min=2171, max=11754, avg=2673.15, stdev=1339.15
    clat percentiles (usec):
     |  1.00th=[ 2114],  5.00th=[ 2147], 10.00th=[ 2147], 20.00th=[ 2147],
     | 30.00th=[ 2147], 40.00th=[ 2180], 50.00th=[ 2212], 60.00th=[ 2343],
     | 70.00th=[ 2409], 80.00th=[ 2474], 90.00th=[ 2606], 95.00th=[ 4621],
     | 99.00th=[ 9241], 99.50th=[10945], 99.90th=[11600], 99.95th=[11731],
     | 99.99th=[11731]
   bw (  KiB/s): min=122880, max=385024, per=99.76%, avg=337237.33, stdev=105105.84, samples=6
   iops        : min=  120, max=  376, avg=329.33, stdev=102.64, samples=6
  lat (msec)   : 4=94.14%, 10=4.98%, 20=0.88%
  cpu          : usr=28.25%, sys=61.08%, ctx=253, majf=262144, minf=11
  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 rwts: total=0,1024,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: bw=330MiB/s (346MB/s), 330MiB/s-330MiB/s (346MB/s-346MB/s), io=1024MiB (1074MB), run=3102-3102msec

Disk stats (read/write):
  nvme0n1: ios=1908/757, merge=0/0, ticks=1255/3876, in_queue=5130, util=84.41%

ご覧のとおり、ディスク統計によると、読み取り1908回と書き込み757回がありました(iosはすべてのグループで実行されたI/Oの数)、このテストケースはシーケンス書き込みのみ(構成を通じてrw=書き込み)、私のNVME問題1908の読み取り値が表示されるのはなぜですか?

私も試しました

  • 順次読み取り(読み取り専用)
Disk stats (read/write):
  nvme0n1: ios=2026/0, merge=0/0, ticks=630/0, in_queue=631, util=69.47%
  • ランダム読み出し(255234個読み、991個書き込み)
Disk stats (read/write):
  nvme0n1: ios=255234/991, merge=0/6, ticks=3936/1739, in_queue=5674, util=95.55%
  • ランダム読み出し(259349個読み、2個書き込み)
Disk stats (read/write):
  nvme0n1: ios=259349/2, merge=0/0, ticks=3453/0, in_queue=3454, util=93.49%

私はlibaio、io_uring、psync(fioのデフォルトのioengine)などの他のioengineも試しましたが、seq | non-seq読み取りは読み取り操作のみをエクスポートし、seq | non-seq書き込みのみ書き込み操作のみをエクスポートします。これは期待どおりにmmapだけが機能します。奇妙なことに。

答え1

マニュアルによると、mmapmmapによって返されたメモリブロックは、ターゲットファイル/ディスクの内容で初期化されます。したがって、fio-mmapエンジンは最初に読み取り要求が発生したファイル/ディスクからデータを読み取ります。

https://man7.org/linux/man-pages/man2/mmap.2.html

ファイルマップの内容(匿名マップとは対照的に、以下のMAP_ANONYMOUSを参照)は、ファイル記述子fdが参照するファイル(または他のオブジェクト)のオフセットオフセットで始まる長さバイトで初期化されます。

関連情報