微信号:kant_prog

介绍:关注Java和Python和云计算技术分享,主要分享一些进阶类的内容希望更多“成长中的程序员”可以从这些内容中学会“思考”.

如何测试存储(上)

2016-08-09 00:35 fireflyc

理解Linux I/O子系统


这幅图基本上说明了Linux I/O子系统的工作原理,应用程序有两种I/O方式:通过VFS读写文件系统通过mmap直接映射磁盘文件读取通过VFS读写文件也有两种方式

  • 直接I/O(direct I/O)直接对硬盘进行读写不经过Page Cache,数据直接传送到用户空间;

  • Buffer I/O 通过Page Cache来缓存数据,读取数据的时候回先读取Cache,如果未命中接下来的读取方式和直接I/O基本一样;写入的时候VFS会写入到Page Cache,由内核进程bdi_writeback写回。

Page Cache还有一个用途,使用mmap(内存映射)读取文件的时候应用不经过VFS直接和Page Cache交互。

读写请求最终会被交给块设备管理层,这一层由通用块设备I/O调度两部分。

  • 通用块设备是块设备的抽象,定义了块设备的读写方法(最终由驱动实现);

  • 所有的I/O请求都一个数据结构(bio),它们被放在一个叫request_queue的队列中,这些请求会被I/O调度算法优化,其实就是做两件事情:合并I/O请求排序I/O。没错,经典的电梯算法,早期版本的Linux I/O调度就叫Linus电梯,目前Linux里面有三种I/O调度算法,cfq、deadline、noop,deadline是Linux默认的I/O调度算法。noop是一个特例,这个算法什么都不做,不排序,不合并,所以它会把I/O请求实实在在的变化一次一次的磁盘读取。

测试要点

理解完Linux I/O子系统了,一起看一下设计测试用例的注意要点:

  • 所有测试都只测试直接I/O。如果考虑Buffer I/O我们就必须考虑内存因素,测试出来的结果受系统当前可用内存大小的影响很大。

  • I/O引擎,Linux提供非常多的I/O引擎实现,同步:sync(对应read、write函数)、psync(对应pread、pwrite函数)、vsync(对应readv、writev函数);异步的:libaio、posixaio。

读取,同步I/O读取的时候会发起I/O请求->把数据放到page cache然后返回(或者通过直接I/O读取后返回)。异步I/O读取的时候回发起I/O请求->返回,当I/O被处理完之后会调用回调来处理读取到的数据,所以一般异步I/O是和直接I/O配合使用,不经过Page Cache。写入:同步I/O会把所有的数据都会真实的被写入到硬盘之后才返回;异步I/O则是把请求交给I/O请求队列之后就不管了(除非调用fsync强制“刷盘”)。

  • 文件类型,裸设备和使用文件系统的I/O效果是差不多的。裸设备的读写也是有直接I/OBuffer I/O的区别的,所以它只是文件系统少了一层VFS而已。(吐个槽,从性能上说Oracle的ASM安装在裸设备和文件系统上的效果其实是差不多的。)

  • 并发,提高I/O速度的秘诀是并发。还记得上图中的I/O请求队列吗?并发的目标就是提高它的利用率(高能提示:不是提高CPU的利用率)。提高利用率不是把它塞满,而是要保持尽可能100%的I/O的同时减少它。

如果队列中有10个请求,系统已经到了极限,再增加I/O请求势必会排队,会造成I/O等待时间提高。所以我们的理想是让I/O饱和但不要超负荷。(通过iostat中的%util、svctm、await来判断是否超负荷)

  • IOPS不重要,IOPS表示每秒钟处理的I/O数量,单独讨论它是没有任何意义的如果你的块很大,写入数据比较少那么IOPS必然很小;如果你的块比较小,写入的数据量比较大那么IOPS必然很大。所以它对测试没有任何指导意义,更多层面可能是厂商用来忽悠的数据而已。

  • 延时、吞吐量才是王道,低延时,高吞吐量才是优秀的I/O表现。低延时意味着所有的I/O请求都比较快速的被处理——同时它也意味着高吞吐量。但是未必意味着高IOPS,因为我们的I/O是会被调度算法合并和排序的。(除非是随机读写,这样I/O调度的影响会小,IOPS也就上去了)

设计测试用例

测试用例应该从几个维度定义

  • 使用直接I/O

  • 定义I/O调度算法

  • 定义I/O引擎

  • 定义文件类型(裸设备或者文件系统二者选择一个就可以,差别而不大)

  • 定义I/O并发数

  • 定义写入数据块大小,4k,8k,16k,32k;定义写入方式顺序,随机(这两点很容易理解所以上面没有做任何解释

测试用例应该重点关注

  • 每个I/O的延时

  • I/O吞吐量

接下来

下一篇介绍测试工具fio,用它来完成实际的测试。随机读写、顺序读写。我们还会一起分析fio的输出结果。

欢迎关注公众账号了解更多信息“写程序的康德——思考、批判、理性”

 
写程序的康德 更多文章 如何测试存储(下) 我的IT学习经历 工程化你的Python项目 工程化你的Python项目 谈谈编程范式
猜您喜欢 你必须非常努力,才能看起来毫不费力 如果你喜欢上了一个程序源小伙······ 初试ReactNative 2015上半年十大经典新媒体营销案例 聚美架构师在行话题「如何快速学习一门编程语言?」,约么?