Fio crc 数据校验验证

一 参数的含义

bash 复制代码
--verify_only #不执行指定的IO负载,仅进行数据校验,且与time_based 互斥
--do_verify #默认值为TRUE,在写入后进行校验,仅当设置校验值时生效
--verify #如果写入文件,可在每个job完成后验证,每种不同的校验方式还意味着不同的header 构成
--verify_offset #写入前将header与数据块其他位置数据交换,在校验前才交换回来
--verify_pattern #指定写入和要校验的数据pattern
--verify_interval #以比blocksize更小的粒度写入验证的header
--verify_fatal #默认值FALSE,在第一次遇到校验失败时退出,否则继续检查剩余全部数据
--verify_dump #将原始块数据读取到文件储存,默认关闭
--verify_async #指定1个或者多个线程校验,为一个整数
--verify_async_cpus #指定校验IO在哪个CPU上执行,与cpus_allowed同用
--verify_backlog #如果启用此选项,fio 将在验证这些块之前仅写入 N 个块。
--verify_backlog_batch #
--verify_state_save #如果在写在某个阶段退出,保存当前状态;允许replay到保存的状态点
--verify_state_load # 校验时读取verify_state_save 的状态点,如果没有则将完整允许IO负载
--experimental_verify #启用实验验证。 标准验证记录 I/O 元数据以供以后在验证阶段使用。 
#相反,实验验证会在写入阶段后重置文件,然后在验证阶段重播 I/O。

二 CRC32 校验原理

原始数据 → 生成CRC32校验值 → 写入数据 + 校验头 → 存储设备

从设备读取数据 → 提取校验头 → 重新计算CRC32 → 比较校验值 → 报告结果

可以看到j校验包含了两部分 header +数据

三 验证结果

1 crc32 校验

1 写入10M的数据

bash 复制代码
fio --filename=/dev/nvme0n1 --rw=write --bs=128k --size=10m --do_verify=0 --verify=crc32 --name=mytest --iodepth=16 --numjobs=1 --ioengine=libaio 

2 从偏移量0开始 查看前64个字节

黄色部分是header 前40个字节

bash 复制代码
root@debian:~/xuetao/fio_crc_check# hexdump  /dev/nvme0n1 -n 64  -s 0 
0000000 acca 0004 0000 0002 543c c509 cc01 00a4
0000010 0000 0000 0000 0000 0000 0000 51d1 1ce2
0000020 0001 0000 f1d9 7736 e8f3 d77a 2f24 b1eb
0000030 153c 9c45 c6b6 0ae0 2364 0473 f5db bccb
0000040

3 读校验 测试不会报错

bash 复制代码
fio --filename=/dev/nvme0n1 --rw=read --bs=128k --size=10m --do_verify=1 --verify=crc32 --name=mytest --iodepth=16 --numjobs=1 --ioengine=libaio

4 读取一下前64个字节 不会有任何变化

bash 复制代码
root@debian:~/xuetao/fio_crc_check# hexdump  /dev/nvme0n1 -n 64  -s 0 
0000000 acca 0004 0000 0002 543c c509 cc01 00a4
0000010 0000 0000 0000 0000 0000 0000 51d1 1ce2
0000020 0001 0000 f1d9 7736 e8f3 d77a 2f24 b1eb
0000030 153c 9c45 c6b6 0ae0 2364 0473 f5db bccb
0000040

5 写入一笔错误数据

将前2个字节数据清零

bash 复制代码
dd if=/dev/zero of=/dev/nvme0n1 bs=2  count=1 conv=notrunc

6 清零后读取数据

可以看到前2个字节由acca 变成了0000

bash 复制代码
root@debian:~/xuetao/fio_crc_check# hexdump  /dev/nvme0n1 -n 64  -s 0 
0000000 0000 0004 0000 0002 543c c509 cc01 00a4
0000010 0000 0000 0000 0000 0000 0000 51d1 1ce2
0000020 0001 0000 f1d9 7736 e8f3 d77a 2f24 b1eb
0000030 153c 9c45 c6b6 0ae0 2364 0473 f5db bccb
0000040

7 此时在做校验 必然报错

verify: bad magic header 0 :这句告诉我们header的magic值被修改成了0,期望值是acca

bash 复制代码
fio --filename=/dev/nvme0n1 --rw=read --bs=128k --size=10m --do_verify=1 --verify=crc32 --name=mytest --iodepth=16 --numjobs=1 --ioengine=libaio 
mytest: (g=0): rw=read, bs=(R) 128KiB-128KiB, (W) 128KiB-128KiB, (T) 128KiB-128KiB, ioengine=libaio, iodepth=16
fio-3.33
Starting 1 process
verify: bad magic header 0, wanted acca at file /dev/nvme0n1 offset 0, length 131072 (requested block: offset=0, length=131072)
fio: pid=67283, err=84/file:io_u.c:2190, func=io_u_queued_complete, error=Invalid or incomplete multibyte or wide character

8 重新写入acca到header文件中

bash 复制代码
 printf '\xca\xac' | dd of=/dev/nvme0n1 bs=2 count=1 conv=notrunc

9 查看数据已经恢复原样

bash 复制代码
root@debian:~/xuetao/fio_crc_check# hexdump  /dev/nvme0n1 -n 64  -s 0 
0000000 acca 0004 0000 0002 543c c509 cc01 00a4
0000010 0000 0000 0000 0000 0000 0000 51d1 1ce2
0000020 0001 0000 f1d9 7736 e8f3 d77a 2f24 b1eb
0000030 153c 9c45 c6b6 0ae0 2364 0473 f5db bccb
0000040

10 校验通过

bash 复制代码
root@debian:~/xuetao/fio_crc_check# fio --filename=/dev/nvme0n1 --rw=read --bs=128k --size=10m --do_verify=1 --verify=crc32 --name=mytest --iodepth=16 --numjobs=1 --ioengine=libaio 
mytest: (g=0): rw=read, bs=(R) 128KiB-128KiB, (W) 128KiB-128KiB, (T) 128KiB-128KiB, ioengine=libaio, iodepth=16
fio-3.33
Starting 1 process

mytest: (groupid=0, jobs=1): err= 0: pid=68386: Sun Jan  3 20:27:45 2021
  read: IOPS=2222, BW=278MiB/s (291MB/s)(10.0MiB/36msec)
    slat (usec): min=8, max=722, avg=64.91, stdev=115.45
    clat (usec): min=382, max=6467, avg=5250.69, stdev=1551.14
     lat (usec): min=392, max=6500, avg=5315.60, stdev=1519.52
    clat percentiles (usec):
     |  1.00th=[  383],  5.00th=[ 1582], 10.00th=[ 2802], 20.00th=[ 3720],
     | 30.00th=[ 5080], 40.00th=[ 6063], 50.00th=[ 6063], 60.00th=[ 6128],
     | 70.00th=[ 6194], 80.00th=[ 6194], 90.00th=[ 6456], 95.00th=[ 6456],
     | 99.00th=[ 6456], 99.50th=[ 6456], 99.90th=[ 6456], 99.95th=[ 6456],
     | 99.99th=[ 6456]
  lat (usec)   : 500=1.25%, 1000=1.25%
  lat (msec)   : 2=3.75%, 4=13.75%, 10=80.00%
  cpu          : usr=82.86%, sys=11.43%, ctx=10, majf=0, minf=521
  IO depths    : 1=1.2%, 2=2.5%, 4=5.0%, 8=10.0%, 16=81.2%, 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=98.5%, 8=0.0%, 16=1.5%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=80,0,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=16

Run status group 0 (all jobs):
   READ: bw=278MiB/s (291MB/s), 278MiB/s-278MiB/s (291MB/s-291MB/s), io=10.0MiB (10.5MB), run=36-36msec

Disk stats (read/write):
  nvme0n1: ios=0/0, merge=0/0, ticks=0/0, in_queue=0, util=0.00%
root@debian:~/xuetao/fio_crc_check# 

2 pattern校验

1 写入固定的pattern 0xffff

bash 复制代码
fio --filename=/dev/nvme0n1 --rw=write --bs=4k --size=1m --do_verify=0 --verify_pattern=0xffff --name=mytest  --verify=pattern

2 查看具体的数据

bash 复制代码
root@debian:~/xuetao/fio_crc_check# hexdump  -v /dev/nvme0n1 -n 64 -s 0 
0000000 ffff ffff ffff ffff ffff ffff ffff ffff
0000010 ffff ffff ffff ffff ffff ffff ffff ffff
0000020 ffff ffff ffff ffff ffff ffff ffff ffff
0000030 ffff ffff ffff ffff ffff ffff ffff ffff
0000040

3 读校验

bash 复制代码
fio --filename=/dev/nvme0n1 --rw=read --bs=4k --size=1m --do_verify=1 --verify_pattern=0xffff --name=mytest  --verify=pattern

4 故障模拟

方法是上述相同,如下

bash 复制代码
root@debian:~/xuetao/fio_crc_check#  dd if=/dev/zero of=/dev/nvme0n1 bs=2  count=1 conv=notrunc
1+0 records in
1+0 records out
2 bytes copied, 0.000411834 s, 4.9 kB/s
root@debian:~/xuetao/fio_crc_check# hexdump  -v /dev/nvme0n1 -n 64 -s 0 
0000000 0000 ffff ffff ffff ffff ffff ffff ffff
0000010 ffff ffff ffff ffff ffff ffff ffff ffff
0000020 ffff ffff ffff ffff ffff ffff ffff ffff
0000030 ffff ffff ffff ffff ffff ffff ffff ffff
0000040
root@debian:~/xuetao/fio_crc_check# fio --filename=/dev/nvme0n1 --rw=read --bs=4k --size=1m --do_verify=1 --verify_pattern=0xffff --name=mytest  --verify=pattern 
mytest: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
fio-3.33
Starting 1 process
fio: got pattern '00', wanted 'ff'. Bad bits 8
fio: bad pattern block offset 0
pattern: verify failed at file /dev/nvme0n1 offset 0, length 4294967295 (requested block: offset=0, length=4096, flags=8)
fio: verify type mismatch (65535 media, 18 given)
root@debian:~/xuetao/fio_crc_check#  printf '\xff\xff' | dd of=/dev/nvme0n1 bs=2 count=1 conv=notrunc
1+0 records in
1+0 records out
2 bytes copied, 0.000163671 s, 12.2 kB/s
root@debian:~/xuetao/fio_crc_check# hexdump  -v /dev/nvme0n1 -n 64 -s 0 
0000000 ffff ffff ffff ffff ffff ffff ffff ffff
0000010 ffff ffff ffff ffff ffff ffff ffff ffff
0000020 ffff ffff ffff ffff ffff ffff ffff ffff
0000030 ffff ffff ffff ffff ffff ffff ffff ffff
0000040
root@debian:~/xuetao/fio_crc_check# fio --filename=/dev/nvme0n1 --rw=read --bs=4k --size=1m --do_verify=1 --verify_pattern=0xffff --name=mytest  --verify=pattern 
mytest: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
fio-3.33
Starting 1 process

mytest: (groupid=0, jobs=1): err= 0: pid=69748: Sun Jan  3 20:49:58 2021
  read: IOPS=128k, BW=500MiB/s (524MB/s)(1024KiB/2msec)
    clat (nsec): min=390, max=400390, avg=6530.51, stdev=39368.16
     lat (nsec): min=411, max=400416, avg=6579.62, stdev=39378.08
    clat percentiles (nsec):
     |  1.00th=[   414],  5.00th=[   434], 10.00th=[   442], 20.00th=[   466],
     | 30.00th=[   490], 40.00th=[   532], 50.00th=[   612], 60.00th=[   636],
     | 70.00th=[   668], 80.00th=[  1320], 90.00th=[  1448], 95.00th=[  1560],
     | 99.00th=[292864], 99.50th=[329728], 99.90th=[399360], 99.95th=[399360],
     | 99.99th=[399360]
  lat (nsec)   : 500=33.59%, 750=43.36%, 1000=1.56%
  lat (usec)   : 2=17.97%, 20=0.39%, 50=0.39%, 100=0.39%, 250=1.17%
  lat (usec)   : 500=1.17%
  cpu          : usr=0.00%, sys=0.00%, ctx=7, majf=0, 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=256,0,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):
   READ: bw=500MiB/s (524MB/s), 500MiB/s-500MiB/s (524MB/s-524MB/s), io=1024KiB (1049kB), run=2-2msec

Disk stats (read/write):
  nvme0n1: ios=0/0, merge=0/0, ticks=0/0, in_queue=0, util=0.00%
root@debian:~/xuetao/fio_crc_check# 
相关推荐
就叫_这个吧12 小时前
Java递归方法实现面包屑导航
java·开发语言
To_OC12 小时前
面试被问了三回三栏布局,这次我终于把 BFC 那层窗户纸捅破了
前端·css·面试
fīɡЙtīиɡ ℡12 小时前
AI 应用系统设计
java·开发语言·人工智能
Lonely 净土12 小时前
Linux 运维文件写入操作
linux·运维·服务器·文件管理
城管不管12 小时前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展
码匠许师傅12 小时前
【C++ 面试真题】26. 聊聊 C++ 的智能指针
java·c++·面试
倔强的石头10613 小时前
向量数据库从相似度检索走向融合数据底座
数据库
To_OC13 小时前
啃完 TS 工具类型我发现:Pick 和 Omit 原来就是一层窗户纸
前端·面试·typescript
AI绘画哇哒哒13 小时前
【建议收藏!】35岁后端血泪忠告,这3类人别硬转Agent(过来人亲述)
java·人工智能·后端·ai·程序员·大模型·agent
最强小杰13 小时前
gpt-5.6-sol 频繁报 503 怎么办?区分容量熔断和限速 429 的排查方法 + 可复用 retry wrapper
java·人工智能·gpt·ai