专题:磁盘IO-通过Fio测试服务器IO性能

服务器选型 ?

该如何选 ?

担心硬件无法匹配业务需求 ?

接上个专题,本文给大家介绍如何使用Fio进行磁盘性能测试,Fio是linux平台下常用的测试工具,工具作者是Jens Axboe,功能强大;

开发者wiki简介

硬盘读写基础知识

到目前为止,计算机基本都是采用冯•诺依曼体系结构所设计的,参考如下图:

具体工作原理:CPU负责指令发送,内存缓存动态数据,硬盘为数据存储;

运行速度:CPU>内存>硬盘,一般情况下CPU计算能力会过剩,内存用以缓存,硬盘做数据存储,SSD的出现,逐步降低了硬盘对整体速度的拖累。

下面用一张形象图,帮助理解(图片来源于网络):

综上:我们要测试磁盘的性能,必须要大概了解计算机的工作原理;

目前为止,CPU的计算能力越来越快,时钟频率睿频后能达到4.5GHz甚至更高,发送指令为几微秒,但硬盘的处理速度几百微秒甚至是几毫秒,CPU的工作模式,当一个指令未完成,该线程会一直等待,直到处理完成;

当我们的硬盘为普通HDD时,处理能力有限,同步模式测试可能就能达到该磁盘的性能极限,但若我们使用SSD硬盘,其并行处理能力远超HDD,同一时间可以执行32-256个读写命令,在这种情况下,我们建议使用异步模式进行测试,但我们也不能无限制的增加硬盘的负载,所以在fio测试命令中有一个参数:队列深度,用以控制CPU指令队列的数量,防止CPU指令无限发送,等待时间过长,导致无法测试出硬盘的最大性能;

Iodepth介绍

上图来源于维基百科

AHCI与NVMe两种接口之间的对比表明:

AHCI接口只拥有一个队列,每个队列深度最大为32;

NVMe接口最高拥有64K个队列,每个队列深度最大为64K;

所以使用SATA接口的硬盘,测试硬盘性能时,队列深度建议最大设为32,再高,只会降低测试的性能值;

若使用NVMe硬盘,深度可以适当的增加,这取决于硬盘本身的性能;

安装Fio(Centos7.4)

Fio下载地址:

http://freshmeat.sourceforge.net/projects/fio/

下载好后,直接解压后编译安装:

若机器已经联网,也可通过yum的方式进行安装:

yum install -y fio libaio-devel#安装fio及libaio引擎;

Fio测试示例

我们现在通过一个简单的例子来对FIO做个初步了解:

-rw=randread:读写模式,randread是随机读测试,read/write/randread/randrw分别为顺序读/顺序写/随机读/随机读写;

-ioengine=libaio:libaio指的是异步模式,同步为sync;

-direct=1:是否使用directIO,使用异步模式时需设置该选项为1;

-thread:使用pthread_create的方式创建任务,默认是使用fork的方式创建;

-numjobs=1:每个job是一个线程;

-iodepth=64:队列深度64;

-filename=/dev/sdb:数据写入到/dev/sdb这个磁盘;

-size=10G:每线程写入数据量为10GB;

-name=mytest:任务名称;

-offset=0MB:从偏移量地址0MB开始写入;

-bs=4k:每个BIO命令包含的数据大小为4KB,一般来说,bs=4KB,会用来测试IOPS Performance;

-output TestResult.log:日志输出到TestResult.log;

-runtime=300:测试时间为300s;

-group_reporting:测试结果显示模式,该值表示汇总每个进程的统计信息;

命令解析,我们使用异步测试的时候,建议打开 -direct=1,因我们此次测试的硬盘为SSD硬盘,所以我们iodepth设置为32,建议就是根据您的机器,调整这些参数,可以测试出最优值;

测试结果解析

图中结果可以看到关键参数:

Run status group 0 (all jobs):

bw=aggrb=236864KB/s;

read iops=aggrb/4=59216(换算成4KB);

io=10240MB为总共10GB的IO数据;

Latency:

Slat(usec)发命令时间:min=3 max=642 avg=13.51 stdev(标准差)=9.59

Clat(usec)执行命令时间,lat(usec)总延时时间,一般情况下我们参考lat就OK;

clat percentiles (usec):延时的统计分布,比如99.00th=[ 1656],表示99%的读命令延时都在1656usec以内;

若您对IOPS的值比较在意,那就建议bs=4k进行测试,业内测均以4k为测试基准判定IOPS性能;

若您对带宽要求比较高,建议bs=1M甚至更高,以达到带宽更优化;

对于IO性能测试,小编建议您通过调整不同的参数,测试一个最合适您应用场景的值,并不用一味的追求高IO,不同的业务场景IO需求不一样;

参考测试命令(根据实际场景进行调整)

4K异步随机写:

4K异步顺序读:

常用调整参数为:iodepth,numjobs,bs,rw,ioengine,size等,详细信息可参考fio官网给出的说明;

使用方法介绍到此,若大家有疑问可以在公众号里留言,我们可以一起探讨;

参考资料:

百度百科,维基百科,Fio官网

链接:

https://fio.readthedocs.io/en/latest/fio_doc.html#i-o-depth

https://en.wikipedia.org/wiki/NVM_Express

若有疑问可直接在公众号中留言,我们接到反馈,会及时回复,感谢您的阅读,如果您喜欢我们的文章,还请关注并帮忙宣传;

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181124G1JPK000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券