笔记之DirectIO时的IO放大探究

DirectIO时的IO放大探究


(对读取一个文件时进行io的测试:

    现象1中,iostat测试的IOPS为100多,测试程序测试的IOPS为50,约为iostat统计数据的一半。iostat测试出来的IOPS减去测试程序测试的IOPS所得的io个数就是所谓的额外IO。为什么会这样?因为读取一个文件时,会读取文件的数据块和索引块,iostat对读取这两类块的io都会测试到,而测试程序只是会对读取数据块的io进行测试。

   现象2中,cat测试的该设备(指的是磁盘)被读的数据量为77292KB,测试程序测试的读取的数据量为40000KB。cat测试的数据量减去测试程序测试的数据量所得的数据量差就是所谓的额外IO。为什么会这样?因为读取一个文件时,会读取文件的数据块和索引块,cat对读取这两类块的io都会测试到,而测试程序只是会对读取数据块的io进行测试。)

===================================

至此,我们不仅进行了测试,更进一步从源头上分析了测试结果的原因,形成如下有效结论:


     ext3采用的文件索引方式来查找一个文件所在的位置(相对于一个文件所在分区的开始地址

的偏移位置,偏移位置以字节或是扇区为单位)。在读取偏移位置较大的文件时候会产生额外IO,

就是因为要读取一个文件的内容首先就要读取该文件所在的偏移位置,那如何知道一个文件的偏移

位置, ext3采用的文件索引方式来查找一个文件所在的位置,所以就是要读取索引块来获取文件

的偏移位置(索引块中的一个条目包含的信息为文件(操作系统中的目录路径+文件名)对应到文

件在磁盘上的物理地址,即读取文件时,操作系统根据文件的操作系统中的目录路径+文件名(这

是操作系统已知的信息)在索引块中查找文件对应的文件在磁盘上的物理地址),故而在读取偏移

位置较大的文件时候产生的额外IO就是(为了获取文件的偏移位置而)读取索引块(指的是在磁盘

上的索引块,如果查找文件位置所需的索引块在内存上的buffer cache缓存上则不会去磁盘读取,

也就不会产生额外IO)而产生的io,而且偏移越大,额外IO次数越多。



    Linux采用了buffer cache缓存ext3的索引块(即用于存放文件的操作系统中的目录路径+文件

名对应到文件在磁盘上的物理地址这一信息的块),查找数据块(即组成文件的块,用于存放文件

的数据)位置会首先在缓存中查找索引块,缓存未命中需要从磁盘读取索引块; Linux采用了page

cache来缓存在ext3里的文件的数据块。


    DirectIO时Linux内核发出的IO请求次数实际上与以下因素相关:
a).逻辑块在物理磁盘上的连续性;

映射完成后(且每次映射完成均)开始进行IO,这里的IO操作也是比较有趣的,对应了代码第三个

关键点:submit_page_section()。一般来说,文件系统要进行IO主要就是调用块设备层的

submit_bio接口,我们只需设置好参数即可。submit_page_section()为了效率上的考虑,实现了

deferIO,核心思想是:不立即发起IO操作,而是等等看(submit_page_section()每次执行都会等

待一个指定的时间,在这段时间里有后续的IO请求过来且该后续的IO请求所请求的数据与本次IO请

求所请求的数据连续,则将该后续的IO请求和本次IO请求合并为一个IO请求;如果时间到了,还没

有可以与本次IO请求合并的IO请求,则将本次IO先发下去),看看后面的IO请求是否连续(所谓的

连续IO是指同一个页面内物理块号连续的IO)。如果有,我们将它合并进来;否则将本次IO先发下

去(调用submit_bio)在我们的情境中,第一次的IO请求位于page1的block 0和block 1(物理块号

为100和101),第二次IO请求其实是page0的block 2(物理块号300),第三次的IO请求其实是page1

的block 3,因此会产生3次IO请求。

注释:这里说的逻辑块指的是内存上的页面page?page里包含的block(或是说组成page的block)

指的是文件系统块?
b).应用程序缓冲区对齐粒度,编程中尽量做到以PAGE_SIZE对齐。


注释:

应用程序缓冲区大小如何设置?
还是执行一次如read()函数,该函数就会开辟一块由参数值指定的大小的应用程序缓冲区,执行

完毕这次read()函数后就销毁该应用程序缓冲区?不是的,如果一次read文件后就销毁应用程序

缓冲区,下一次再read该文件时就不能从该应用程序缓冲区读取了,这就没有达到应用程序缓冲区

的作用即让下一次的read不用去磁盘读取该文件,而是从应用程序缓冲区。

DirectIO时没有文件系统缓存区,只有应用程序缓冲区。
===============================================
内存缓存 以页为单位 页大小
磁盘上的文件系统 以文件系统块(在windows中叫簇)为单位  文件系统块大小

页大小和文件系统块大小各自独立设置,没有关联

你可能感兴趣的:(笔记之DirectIO时的IO放大探究)