资源描述:
《网易视频云:DirectIO时的IO放大探究》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、网易视频云:DirectIO时的2放大探究网易视频云是网易倾力打造的一款基于云计算的分布式多媒体处理集祥和专业音视频技术,为客户提供稳定流畅、低时延、高并发的视频直播、录制、存储、转码及点播等音视频的PASS服务。在线教育、远程医疗、娱乐秀场、在线金融等各行业及企业川户只需经过简单的开发即可打造在线音视频平台。现在,网易视频云与大家分亨一下Directl0时的10放大探究。前段时间在对我们自己开发的文件系统测试过程中发现一个冇趣的现象:IO放大。测试现彖描述如下:现象1:iostat-x/dev/sdh1,观察发现每秒完成的读请求次数100+,而测试程序统计的实际I
2、OPS为50,约为iostat统计数据的一半;现彖2:cat/sys/block/sdh1/stat发现测试程序运行过程中,该设备被读的数据量为77292KB,而测试程序实际读数据量为40000KB。我们会在下面的两个测试以及原理分析中揭示这些额外10来口何方。测试1:不同offset读文件测试测试目的测试ext3文件系统元数据(索引块)对文件读性能影响测试方法顺序读数据口录(500个1GB大小文件)所有文件,每个文件读一次,每轮测试中读文件offset-致,一共执行五轮,offset分别为32KB,48KB.64KB,1GB-40KB,每轮测试之前清空缓存(ech
3、o3>/proc/sys/vm/drop_caches),使用O_DIRECT方式读,每次读4KB。测试结果IOPSOIOP5offset图1不同offset读IOPSM90mw3504030MJ表1不同offset读数据重对比读offset测试前已读扇区测试后已读扇区测试读扇区数实际读数据里(KB)预期读数据里(KB)32K21044894321045345545122256200048K21045382921046227184424221200064K2104624232104708878464423220001G-40K20148418321049665512
4、47262362000结论上面的测试较为冇力地解释了ext3文件系统元数据(主要指索引块)对杜性能彩响。在元数据缓存未命屮悄况下,读文件offset越大,产生额外10越多,IOPS越低。测试2:元数据缓存性能测试测试目的测试ext3文件系统元数据(主要指索引块)缓存与否对文件读性能影响测试方法顺序读数据忖录下所有文件(500个,每个大小为1GB),每个文件只读一次,offset为1GB-40KB(根据计算,ext3此时使用二级间接索引)。测试共执行两轮,第一轮测试之前清cache,第二轮测试之前不消理cache,使用O_DIRECT方式读,读大小4KB。测试结果表2
5、有无元数据缓存读写性能对比测试场景IOPS实际读数据里(KB)测试1(无缓存)376228测试2(有缓存)642008结论该测试对比了ext3文件系统元数据缓存与否对读性能影响,元数据未缓存情况下,产生的额外I0越多,IOPS越低。而且,因为每次读偏移位于二级索引,需耍两次额外的元数据I0,每个索引块人小为4KB,所以实际读出数据量应该为期塑读数据量的三倍,与测试结果较吻合。原理分析为了进一步弄清楚这个问题,我们本着打破砂锅问到底的粘神,翻阅了Linux内核代码,看看文件系统direct方式读的实现,需要说明的是我们使川的内核代码版本为3.12,在代码分析Z前,先來
6、普及一个概念:文件系统和底层块设备都冇自己的块人小设置,而且,这两者可以不相同。块设备的默认块大小为512字节,有兴趣的可以自己查看下hd」nit()这个函数。文件系统,如ext3,默认块大小是1024字节(可以自己挂戦文件系统的时候设置,但最小1024字节,最大为PAGE.SIZE),冇兴趣的同学可以自己査看下ext3_fill_super()这个前数。因此一般说來,文件系统块大小是块设备默认大小的整数倍,明白这个对理解后面的实现比较重要。另外,我们看看direct方式读接口参数需要注意的几点,read接口形式为:readffd,buffer,size)注意:1.
7、buffer需要对齐,对齐的单位是块大小,按照文件块大小或者设备块大小对齐均可,可通过凿数posix_memalign()來分配按照一定粒度对齐的缓冲区;2.读偏移offset必须以文件或者设备块人小对齐;3.读大小size必须以文件或者设备块大小对齐:4.上述只要有一点不满足,调用失败,返冋错误信息为"Invalidargument”。同样,我们通过情境分析的方式來分析实现,要不显得实在是枯燥,假如我们读的调用形式为read(fd,buffer,4096)其中,buffer以1024字节对齐,分配的buffer地址为0X804a400,offset从0开始。跟