关于FIO测试和硬盘性能问题测试学习总结

最近遇到了两个现场的问题是关于硬盘性能偏低的问题,测试工具是FIO。之前做对外测试时硬盘的性能测试结果都没出过什么问题,测完以后很多东西都没记住,现在做维护了,要基于客户提出的问题做测试调优,涉及知识维度更大了,所以总结下这次处理所了解到的知识和思路,好记性不如烂笔头
首先关于FIO这个工具的测试结果,我们一般需要关注的指标有三个,分别是带宽,IOPS,延时。这三个指标在硬盘厂商的官网上都会有相应的规格书去写明一个基本的规格值。在具体的测试结果中,这三个值是下面read这一行的bw,iops以及lat这一行的avg值。其中延时默认的单位是微秒。清楚这三个值以后我们才能去具体的进行测试调优,还有一些关于延时时间分布占比以及IO占比的这里就不赘述了,属于比较深入的指标,在比较复杂的硬盘测试中可能才会涉及,网上的相关资料也很多

[root@localhost ~]#  fio -name=test -filename=/dev/sda -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -bs=4K -

group_reporting -numjobs=1 -size=1G -runtime=300 -time_based
test: (g=0): rw=randread, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=128
fio-2.2.8
Starting 1 process
Jobs: 1 (f=1): [r(1)] [100.0% done] [420.1MB/0KB/0KB /s] [108K/0/0 iops] [eta 00m:00s]
test: (groupid=0, jobs=1): err= 0: pid=32820: Tue Feb 15 06:30:01 2022
  read : io=128376MB, bw=438189KB/s, iops=109547, runt=300002msec
    slat (usec): min=2, max=1744, avg= 4.49, stdev= 5.73
    clat (usec): min=25, max=12153, avg=1161.69, stdev=356.67
     lat (usec): min=30, max=12157, avg=1166.68, stdev=356.56
    clat percentiles (usec):
     |  1.00th=[  572],  5.00th=[  700], 10.00th=[  772], 20.00th=[  868],
     | 30.00th=[  948], 40.00th=[ 1020], 50.00th=[ 1096], 60.00th=[ 1176],
     | 70.00th=[ 1288], 80.00th=[ 1432], 90.00th=[ 1672], 95.00th=[ 1864],
     | 99.00th=[ 2160], 99.50th=[ 2256], 99.90th=[ 2512], 99.95th=[ 2640],
     | 99.99th=[ 4048]
    bw (KB  /s): min=375024, max=451856, per=100.00%, avg=440624.62, stdev=10381.43
    lat (usec) : 50=0.01%, 100=0.01%, 250=0.01%, 500=0.22%, 750=8.16%
    lat (usec) : 1000=29.07%
    lat (msec) : 2=59.90%, 4=2.64%, 10=0.01%, 20=0.01%
  cpu          : usr=13.50%, sys=70.38%, ctx=770849, majf=0, minf=164
  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.0%, >=64=0.1%
     issued    : total=r=32864364/w=0/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=128

Run status group 0 (all jobs):
   READ: io=128376MB, aggrb=438188KB/s, minb=438188KB/s, maxb=438188KB/s, mint=300002msec, maxt=300002msec

Disk stats (read/write):
  sda: ios=32841279/0, merge=0/0, ticks=32140693/0, in_queue=32139750, util=100.00%

在初步了解了FIO的测试结果之后,还需要了解FIO常用的命令参数,其中我觉得比较有必要的如下
filename=/dev/sda:这个就是选择测试哪个设备
direct=1:测试结果绕过机器自带的buffer,使测试结果更真实
rw:选择测试模式,有顺序读/写,随机读/写,混合随机和混合顺序
bs:块大小,4k,
iodepth:IO的队列深度
numjobs:测试线程数
runtime:测试时间,单位默认为秒,如果不设置时间就会把整个盘分成bs块大小跑完为止
group_reporting:多线程时设置了这个才能看到总结果
ioengine=libaio:引擎采用libaio方式

以上参数我们还需要了解一些额外的内容,最主要的我认为是bs,iodepth这两个参数,因为他们的调整会直接影响到我们关注的带宽、IOPS、延时的数据,因此当我们具体关注某个指标时,这两个参数也应当对应调整为适合测试这个指标的形式,这是比较细致的测试方式,也能注意到有些业务团队会用统一的测试命令同时关注这三个指标,但是对于我们定位问题进行调优时,搞清楚参数和指标的关系就比较重要了。通过我自己的测试以及获取问题局点所反馈上来的测试方法,可以看出当iodepth较大时,延迟会非常高,但是这时候IOPS会比较真实,所以适合关注IOPS指标,当iodpeth为1时,时延会比较真实,此时的数据适合用来和硬盘的官方标准对比。当bs块大小比较小时,iops也就比较大了,当每次读写的块太大,IOPS自然会比较小,所以当我们比较关注IOPS的测试时,bs都会设置的比较小,一般是4k。当bs设置的比较大时候,可以用来观察带宽指标,这时候IOPS很小。
如下图就是6条测试命令,其中iodpeth为1的是关注时延的,bs为1024k的是关注带宽的,iodepth为128的是关注IOPS的
捕获.PNG

最后,当我们遇到此类性能值偏低问题的时候,我总结了可以按照如下方法定位确认,其中一些具体方法这里就不赘述了,可以具体去搜去试
1.先确认目标,也就是客户的期望值,以及在什么条件下的期望值,最好能确认下来测试参数,固定好后再去调优
2.硬盘性能调优,在没有故障的前提下,可以尝试在OS下、bios下设置CPU高性能模式,还有一些会影响内存性能的参数,比如numa node的数量,也可以尝试设置一下
3.如果有raid卡的,可以设置raid卡的缓存策略以及读写策略尝试能否优化
4.最后系统和平台之间的兼容性也非常重要,也会引发性能问题,我们可以尝试更换一些系统,或者高低版本的内核来判断是否相关

最后,提供一些自动化测试的脚本,可以修改部分参数使用,这种脚本主要作用是整理数据,看起来更直观些,其中第二个整理数据的脚本需要命名为第一个脚本中最后一行的脚本名

一:
#!/bin/bash
#create file name
smartctl -a /dev/sd$1>log
Product_name=`cat log|grep Serial|awk '{print $3}'`
mkdir $Product_name
smartctl -a /dev/sd$1>$Product_name.log
cp *.sh $Product_name
cd $Product_name

##fio test
for bs in 4k 8k 16k 32k 64k 128k 256k 512k 1m 
do
for  rw in read write randread randwrite
do 

fio   -filename=/dev/sd$1 -direct=1 -ioengine=libaio -iodepth=128 -bs=$bs -rw=$rw -numjobs=1 -runtime=5m --group_reporting -name=mytest |tee ${rw}_${bs}.rec
done
sleep 2
done
sleep  5
./get_result.sh

二:
#!/bin/bash

function get_result()
{
if [ $# -lt 1 ] 
then
 echo "please input filename:"
 exit 
else
rw=`cat $1  |grep -i bs |grep -i rw|awk '{print $3 }'`
bs=`cat $1  |grep -i bs |grep -i rw|awk '{print $4 }'`

bw=`cat $1  |grep -i iops |awk -F ',' '{print $2}'`
iops=`cat $1  |grep -i iops |awk -F ',' '{print $3}'`
echo ${bs:3} ${rw:3}  ${bw:4},${iops:6} >>re.csv
fi
}

echo "BS,Modes,BW,IOPS">re.csv
for abs in  4k 8k 16k   32k   64k 128k 256k  512k 1m

do
for  arw in  randread randwrite   read write 
do 
get_result ${arw}_${abs}.rec
done
done

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值