在 Linux 中使用 Fio 来测评硬盘性能

FIO介绍


FIO是测试IOPS的非常好的工具,用来对磁盘进行压力测试和验证。磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类。FIO是一个可以产生很多线程或进程并执行用户指定的特定类型I/O操作的工具,FIO的典型用途是编写和模拟的I/O负载匹配的作业文件。也就是说FIO 是一个多线程io生成工具,可以生成多种IO模式,用来测试磁盘设备的性能(也包含文件系统:如针对网络文件系统 NFS 的IO测试)。

它支持 19 种不同类型的 I/O 引擎 (sync、mmap、libaio、posixaio、SG v3、splice、null、network、 syslet、guasi、solarisaio,以及更多), I/O 优先级(针对较新的 Linux 内核),I/O 速度,fork 的任务或线程任务等等。它能够在块设备和文件上工作。

FIO 工具常用参数:

  • ioengine=libaio 指定io引擎使用libaio方式。libaio:Linux本地异步I/O。请注意,Linux可能只支持具有非缓冲I/O的排队行为(设置为“direct=1”或“buffered=0”);rbd:通过librbd直接访问CEPH Rados
  • iodepth=16 队列的深度为16.在异步模式下,CPU不能一直无限的发命令到SSD。比如SSD执行读写如果发生了卡顿,那有可能系统会一直不停的发命令,几千个,甚至几万个,这样一方面SSD扛不住,另一方面这么多命令会很占内存,系统也要挂掉了。这样,就带来一个参数叫做队列深度。
  • direct=1 是否使用directIO,测试过程绕过OS自带的buffer,使测试磁盘的结果更真实。Linux读写的时候,内核维护了缓存,数据先写到缓存,后面再后台写到SSD。读的时候也优先读缓存里的数据。这样速度可以加快,但是一旦掉电缓存里的数据就没了。所以有一种模式叫做DirectIO,跳过缓存,直接读写SSD。
  • numjobs=1 每个job(任务)开1个线程,这里用了几,后面每个用-name指定的任务就开几个线程测试。所以最终线程数=任务数(几个name=jobx)* numjobs。
参数说明:
filename=/dev/sdb1 测试文件名称,通常选择需要测试的盘的data目录。
direct=1 是否使用directIO,测试过程绕过OS自带的buffer,使测试磁盘的结果更真实。Linux读写的时候,内核维护了缓存,数据先写到缓存,后面再后台写到SSD。读的时候也优先读缓存里的数据。这样速度可以加快,但是一旦掉电缓存里的数据就没了。所以有一种模式叫做DirectIO,跳过缓存,直接读写SSD。 
rw=randwrite 测试随机写的I/O
rw=randrw 测试随机写和读的I/O
bs=16k 单次io的块文件大小为16k
bsrange=512-2048 同上,提定数据块的大小范围
size=5G 每个线程读写的数据量是5GB。
numjobs=1 每个job(任务)开1个线程,这里用了几,后面每个用-name指定的任务就开几个线程测试。所以最终线程数=任务数(几个name=jobx)* numjobs。 
name=job1:一个任务的名字,重复了也没关系。如果fio -name=job1 -name=job2,建立了两个任务,共享-name=job1之前的参数。-name之后的就是job2任务独有的参数。 
thread  使用pthread_create创建线程,另一种是fork创建进程。进程的开销比线程要大,一般都采用thread测试。 
runtime=1000 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。
ioengine=libaio 指定io引擎使用libaio方式。libaio:Linux本地异步I/O。请注意,Linux可能只支持具有非缓冲I/O的排队行为(设置为“direct=1”或“buffered=0”);rbd:通过librbd直接访问CEPH Rados 
iodepth=16 队列的深度为16.在异步模式下,CPU不能一直无限的发命令到SSD。比如SSD执行读写如果发生了卡顿,那有可能系统会一直不停的发命令,几千个,甚至几万个,这样一方面SSD扛不住,另一方面这么多命令会很占内存,系统也要挂掉了。这样,就带来一个参数叫做队列深度。
Block Devices(RBD),无需使用内核RBD驱动程序(rbd.ko)。该参数包含很多ioengine,如:libhdfs/rdma等
rwmixwrite=30 在混合读写的模式下,写占30%
group_reporting 关于显示结果的,汇总每个进程的信息。
此外
lockmem=1g 只使用1g内存进行测试。
zero_buffers 用0初始化系统buffer。
nrfiles=8 每个进程生成文件的数量。
磁盘读写常用测试点:
1. Read=100% Ramdon=100% rw=randread (100%随机读)
2. Read=100% Sequence=100% rw=read (100%顺序读)
3. Write=100% Sequence=100% rw=write (100%顺序写)
4. Write=100% Ramdon=100% rw=randwrite (100%随机写)
5. Read=70% Sequence=100% rw=rw, rwmixread=70, rwmixwrite=30
(70%顺序读,30%顺序写)
6. Read=70% Ramdon=100% rw=randrw, rwmixread=70, rwmixwrite=30
(70%随机读,30%随机写)

常用参数:

filename测试文件名称,通常选择需要测试的盘的data目录
rw=randwrite测试随机写的I/O
rw=randrw测试随机写和读的I/O
bs指定单次io的块文件大小
bsrange提定数据块的大小范围
size指定每个线程读写的数据量

 参考实例

准备个2GB的测试用的文件

dd if=/dev/zero of=/bdata/test.big bs=4k count=524288    # 通常在需要测试的那个磁盘下面生成一个这种测试用的大文件

测试随机写入:

[root@linuxcool ~]# fio --filename=/bdata/test.big -iodepth=64 -ioengine=libaio -direct=1 -rw=randwrite -bs=4k -size=2G -numjobs=64 -runtime=20-group_reporting -name=test-rand-write

测试顺序读取:

[root@linuxcool ~]# fio --filename=/bdata/test.big -iodepth=64 -ioengine=libaio --direct=1 --rw=read --bs=1m --size=2g --numjobs=4 --runtime=10 --group_reporting --name=test-read

测试顺序写入:

fio --filename=/bdata/test.big -iodepth=64 -ioengine=libaio -direct=1 -rw=write -bs=1m -size=2g -numjobs=4 -runtime=20 -group_reporting -name=test-write

 

 

青云 性能测试及结果


如何在大数据量情况下满足多客户机的并发访问,系统的性能也是一个非常关键的要求。而且考虑到将来业务的增长,数据量还会持续增加,客户机的数量也会继续增加,系统的性能还应能很好的适应未来的扩充和扩展的需要,因此要求系统必须能够在规划的数据量和业务规模下,满足应用的访问需求,提供快速的系统响应。

性能测试主要针对青云平台的网络性能、计算性能、IO性能(性能存储)进行各种场景下的读写测试及评估。

 性能型存储测试 测试目的

测试云平台性能型存储的读写性能,重点考察IOPS指标。

测试方法 

使用fio脚本在物理服务器上运行,对所有计算节点进行数据采集。

 测试参数

[global]
ioengine=libaio
direct=1
thread=1
norandommap=1
randrepeat=0
runtime=60
ramp_time=6
size=1g
directory=/pitrix/data/container/iotest

[read4k-rand]
stonewall
group_reporting
bs=4k
rw=randread
numjobs=8
iodepth=32

[read4k-seq]
stonewall
group_reporting
bs=4k
rw=read
numjobs=8
iodepth=32


[write4k-rand]
stonewall
group_reporting
bs=4k
rw=randwrite
numjobs=2
iodepth=4

[write4k-seq]
stonewall
group_reporting
bs=4k
rw=write
numjobs=2
iodepth=4


[read8k-rand]
stonewall
group_reporting
bs=8k
rw=randread
numjobs=8
iodepth=4

[read8k-seq]
stonewall
group_reporting
bs=8k
rw=read
numjobs=8
iodepth=4


[write8k-rand]
stonewall
group_reporting
bs=8k
rw=randwrite
numjobs=8
iodepth=4

[write8k-seq]
stonewall
group_reporting
bs=8k
rw=write
numjobs=8
iodepth=4


[read64k-rand]
stonewall
group_reporting
bs=64k
rw=randread
numjobs=4
iodepth=8

[read64k-seq]
stonewall
group_reporting
bs=64k
rw=read
numjobs=4
iodepth=8

[write64k-rand]
stonewall
group_reporting
bs=64k
rw=randwrite
numjobs=4
iodepth=8

[write64k-seq]
stonewall
group_reporting
bs=64k
rw=write
numjobs=4
iodepth=8

 IOPS:每秒钟的IO数

物理服务器

4K随机读

4K顺序读

4K随机写

4K顺序写

hdyy1ar01n03

4461

97630

33211

30528

hdyy1ar01n04

4375

123035

33471

37633

hdyy1ar01n05

3553

51076

37970

36862

hdyy1ar01n06

4259

123164

32096

26217

[root@docker ~]# mkdir -p /rongliang

[root@docker ~]# lsblk
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vdb    253:16   0   1G  0 disk [SWAP]
vdc    253:32   0  20G  0 disk 
vda    253:0    0  50G  0 disk 
?..vda1 253:1    0  50G  0 part /

[root@docker ~]# mkfs
mkfs         mkfs.btrfs   mkfs.cramfs  mkfs.ext2    mkfs.ext3    mkfs.ext4    mkfs.minix   mkfs.xfs     

[root@docker ~]# mkfs.xfs  /dev/vdc
meta-data=/dev/vdc               isize=512    agcount=4, agsize=1310720 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=5242880, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@docker ~]# mount /dev/vdc  /rongliang
[root@docker ~]# cd /rongliang/
[root@docker rongliang]# fio -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=4k -size=2G -numjobs=1  -name=./fio.test
./fio.test: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
fio-3.7
Starting 1 process
./fio.test: Laying out IO file (1 file / 2048MiB)
Jobs: 1 (f=1): [R(1)][100.0%][r=17.0MiB/s,w=0KiB/s][r=4359,w=0 IOPS][eta 00m:00s]
./fio.test: (groupid=0, jobs=1): err= 0: pid=1998: Sun Nov 21 14:26:12 2021
   read: IOPS=4467, BW=17.4MiB/s (18.3MB/s)(2048MiB/117367msec)
    slat (nsec): min=1900, max=12003k, avg=7052.24, stdev=32482.98
    clat (usec): min=404, max=40757, avg=14317.84, stdev=3084.55
     lat (usec): min=425, max=40761, avg=14325.25, stdev=3085.35
    clat percentiles (usec):
     |  1.00th=[ 6652],  5.00th=[ 8586], 10.00th=[10028], 20.00th=[12125],
     | 30.00th=[13304], 40.00th=[14091], 50.00th=[14615], 60.00th=[15270],
     | 70.00th=[15795], 80.00th=[16581], 90.00th=[17695], 95.00th=[18744],
     | 99.00th=[21365], 99.50th=[22938], 99.90th=[27919], 99.95th=[28967],
     | 99.99th=[32113]
   bw (  KiB/s): min=13232, max=32560, per=100.00%, avg=17874.06, stdev=2958.81, samples=234
   iops        : min= 3308, max= 8140, avg=4468.50, stdev=739.70, samples=234
  lat (usec)   : 500=0.01%, 750=0.06%, 1000=0.08%
  lat (msec)   : 2=0.06%, 4=0.05%, 10=9.88%, 20=87.76%, 50=2.10%
  cpu          : usr=1.26%, sys=4.64%, ctx=192126, majf=0, minf=75
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.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.1%, >=64=0.0%
     issued rwts: total=524288,0,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
   READ: bw=17.4MiB/s (18.3MB/s), 17.4MiB/s-17.4MiB/s (18.3MB/s-18.3MB/s), io=2048MiB (2147MB), run=117367-117367msec

Disk stats (read/write):
  vdc: ios=523676/8, merge=0/3, ticks=7485228/8, in_queue=7479978, util=99.97%

[root@docker ~]# mkdir -p /ssd
[root@docker ~]# lsblk 
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vdd    253:48   0  20G  0 disk 
vdb    253:16   0   1G  0 disk [SWAP]
vdc    253:32   0  20G  0 disk /rongliang
vda    253:0    0  50G  0 disk 
ââvda1 253:1    0  50G  0 part /


[root@docker ~]# mkfs.xfs  /dev/vdd
meta-data=/dev/vdd               isize=512    agcount=4, agsize=1310720 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=5242880, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0


[root@docker ~]# mount /dev/vdd /ssd/

[root@docker ~]# cd /ssd/
[root@docker ssd]# fio -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=4k -size=2G -numjobs=1  -name=./fio.test
./fio.test: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
fio-3.7
Starting 1 process
./fio.test: Laying out IO file (1 file / 2048MiB)
Jobs: 1 (f=1): [R(1)][100.0%][r=26.7MiB/s,w=0KiB/s][r=6844,w=0 IOPS][eta 00m:00s]
./fio.test: (groupid=0, jobs=1): err= 0: pid=2405: Sun Nov 21 14:32:08 2021
   read: IOPS=7017, BW=27.4MiB/s (28.7MB/s)(2048MiB/74711msec)
    slat (nsec): min=1884, max=11603k, avg=6640.77, stdev=43866.88
    clat (usec): min=318, max=25995, avg=9111.40, stdev=2291.46
     lat (usec): min=343, max=26015, avg=9118.39, stdev=2292.74
    clat percentiles (usec):
     |  1.00th=[ 3359],  5.00th=[ 5669], 10.00th=[ 6390], 20.00th=[ 7308],
     | 30.00th=[ 7963], 40.00th=[ 8586], 50.00th=[ 9110], 60.00th=[ 9634],
     | 70.00th=[10159], 80.00th=[10945], 90.00th=[11863], 95.00th=[12780],
     | 99.00th=[15008], 99.50th=[16188], 99.90th=[18744], 99.95th=[19792],
     | 99.99th=[22414]
   bw (  KiB/s): min=19176, max=47328, per=99.96%, avg=28058.68, stdev=3816.74, samples=149
   iops        : min= 4794, max=11832, avg=7014.64, stdev=954.19, samples=149
  lat (usec)   : 500=0.04%, 750=0.36%, 1000=0.12%
  lat (msec)   : 2=0.14%, 4=0.67%, 10=65.66%, 20=32.98%, 50=0.04%
  cpu          : usr=1.80%, sys=6.89%, ctx=182289, majf=0, minf=74
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.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.1%, >=64=0.0%
     issued rwts: total=524288,0,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
   READ: bw=27.4MiB/s (28.7MB/s), 27.4MiB/s-27.4MiB/s (28.7MB/s-28.7MB/s), io=2048MiB (2147MB), run=74711-74711msec

Disk stats (read/write):
  vdd: ios=522700/8, merge=0/3, ticks=4752252/6, in_queue=4746034, util=99.89%
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值