则磁盘的随机io服务时间nvme转接卡
服务时间 = 寻道时间 + 旋转时间 + 传输时间
对于10000转速的sata硬盘来说,一般寻道时间是7 ms,旋转时间是3 ms, 64kb的传输时间是 08 ms, 则sata硬盘每秒可以进行随机io操作是 1000(7 + 3 + 08) = 93,所以我们估算sata硬盘64kb随机写的iops是93。一般的硬盘厂商都会标明顺序读写的mbps。
我们在列出iops时,需要说明io大小,寻址空间,读写模式,顺序随机,队列深度。我们一般常用的io大小是4kb,这是因为文件系统常用的块大小是4kb。
使用dd测试硬盘
虽然硬盘的性能是可以估算出来的,但是怎么才能让应用获得这些性能呢?对于测试工具来说,就是如何得到iops和mbps峰值。我们先用dd测试一下sata硬盘的mbps(吞吐量)。
为什么这块硬盘的mbps只有68mbs 这是因为磁盘利用率是78%,没有到达95%以上,还有部分时间是空闲的。当dd在前一个io响应之后,在准备发起下一个io时,sata硬盘是空闲的。那么如何才能提高利用率,让磁盘不空闲呢?只有一个办法,那就是增加硬盘的队列深度。相对于cpu来说,硬盘属于慢速设备,所有操作系统会有给每个硬盘分配一个专门的队列用于缓冲io请求。
队列深度
什么是磁盘的队列深度?
<<<<<<<<在某个时刻,有n个inflight的io请求,包括在队列中的io请求、磁盘正在处理的io请求。n就是队列深度。加大硬盘队列深度就是让硬盘不断工作,减少硬盘的空闲时间。
<<<<<<<<加大队列深度 -> 提高利用率 -> 获得iops和mbps峰值 -> 注意响应时间在可接受的范围内
增加队列深度的办法有很多
使用异步io,同时发起多个io请求,相当于队列中有多个io请求
多线程发起同步io请求,相当于队列中有多个io请求
增大应用io大小,到达底层之后,会变成多个io请求,相当于队列中有多个io请求 队列深度增加了。
队列深度增加了,io在队列的等待时间也会增加,导致io响应时间变大,这需要权衡。让我们通过增加io大小来增加dd的队列深度,看有没有效果:
可以看到2mb的io到达底层之后,会变成多个512kb的io,平均队列长度为239,这个硬盘的利用率是97%,mbps达到了197mbs。(为什么会变成512kb的io,你可以去使用google去查一下内核参数 max_sectors_kb的意义和使用方法 )
也就是说增加队列深度,是可以测试出硬盘的峰值的。
使用fio测试硬盘
现在,我们来测试下sata硬盘的4kb随机写的iops。因为我的环境是linux,所以我使用fio来测试。
简单介绍fio的参数
ioengine 负载引擎,我们一般使用libaio,发起异步io请求。
bs io大小
direct 直写,绕过操作系统cache。因为我们测试的是硬盘,而不是操作系统的cache,所以设置为1。
rw 读写模式,有顺序写write、顺序读read、随机写randwrite、随机读randread等。
size 寻址空间,io会落在 [0, size)这个区间的硬盘空间上。这是一个可以影响iops的参数。一般设置为硬盘的大小。
filename 测试对象
iodepth 队列深度,只有使用libaio时才有意义。这是一个可以影响iops的参数。
runtime 测试时长
下面我们做两次测试,分别 iodepth = 1和iodepth = 4的情况。下面是iodepth = 1的测试结果。
上图中蓝色方框里面的是测出的iops 230, 绿色方框里面是每个io请求的平均响应时间,大约是43ms。方框表示95%的io请求的响应时间是小于等于 9920 ms。橙色方框表示该硬盘的利用率已经达到了9858%。
下面是 iodepth = 4 的测试
嘉华众力科技有限在基于intel82599芯片 英特尔x520网卡方案的基础上退出了 ceacent an8599-f1(万兆单口光纤网卡)、ceacent an8599-f2(万兆双口光纤网卡)、ceacent an8599-sr2(含模块)等产品,想了解更多存储产品需要合作与咨询搭建方案请联系上的在线客服,嘉华众力自2000年成立以来一直在网络存储、传输这方面积累、沉淀;经过多年发展与全新的品牌定位,(unicaca)嘉华众力品牌已成为国内外极具实力的数据通讯产品及方案提供商,请关注嘉华众力:wwwunicacacom
文章转自:csna 博客 luyegang