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

网友投稿 660 2022-11-02


在 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 Radosiodepth=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/Orw=randrw 测试随机写和读的I/Obs=16k 单次io的块文件大小为16kbsrange=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=libaiodirect=1thread=1norandommap=1randrepeat=0runtime=60ramp_time=6size=1gdirectory=/pitrix/data/container/iotest[read4k-rand]stonewallgroup_reportingbs=4krw=randreadnumjobs=8iodepth=32[read4k-seq]stonewallgroup_reportingbs=4krw=readnumjobs=8iodepth=32[write4k-rand]stonewallgroup_reportingbs=4krw=randwritenumjobs=2iodepth=4[write4k-seq]stonewallgroup_reportingbs=4krw=writenumjobs=2iodepth=4[read8k-rand]stonewallgroup_reportingbs=8krw=randreadnumjobs=8iodepth=4[read8k-seq]stonewallgroup_reportingbs=8krw=readnumjobs=8iodepth=4[write8k-rand]stonewallgroup_reportingbs=8krw=randwritenumjobs=8iodepth=4[write8k-seq]stonewallgroup_reportingbs=8krw=writenumjobs=8iodepth=4[read64k-rand]stonewallgroup_reportingbs=64krw=randreadnumjobs=4iodepth=8[read64k-seq]stonewallgroup_reportingbs=64krw=readnumjobs=4iodepth=8[write64k-rand]stonewallgroup_reportingbs=64krw=randwritenumjobs=4iodepth=8[write64k-seq]stonewallgroup_reportingbs=64krw=writenumjobs=4iodepth=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 ~]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTvdb 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 ~]# mkfsmkfs mkfs.btrfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.minix mkfs.xfs [root@docker ~]# mkfs.xfs /dev/vdcmeta-data=/dev/vdc isize=512 agcount=4, agsize=1310720 blks = sectsz=4096 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0data = bsize=4096 blocks=5242880, imaxpct=25 = sunit=0 swidth=0 blksnaming =version 2 bsize=4096 ascii-ci=0 ftype=1log =internal log bsize=4096 blocks=2560, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1realtime =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=64fio-3.7Starting 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=64Run 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-117367msecDisk 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 MOUNTPOINTvdd 253:48 0 20G 0 disk vdb 253:16 0 1G 0 disk [SWAP]vdc 253:32 0 20G 0 disk /rongliangvda 253:0 0 50G 0 disk ââvda1 253:1 0 50G 0 part /[root@docker ~]# mkfs.xfs /dev/vddmeta-data=/dev/vdd isize=512 agcount=4, agsize=1310720 blks = sectsz=4096 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0data = bsize=4096 blocks=5242880, imaxpct=25 = sunit=0 swidth=0 blksnaming =version 2 bsize=4096 ascii-ci=0 ftype=1log =internal log bsize=4096 blocks=2560, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1realtime =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=64fio-3.7Starting 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=64Run 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-74711msecDisk stats (read/write): vdd: ios=522700/8, merge=0/3, ticks=4752252/6, in_queue=4746034, util=99.89%


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java正则表达式匹配不到结果的解决
下一篇:Prometheus 基于pod服务发现监控tomcat
相关文章

 发表评论

暂时没有评论,来抢沙发吧~