iometer 1.1.0 重要特性说明之O_DIRECT flag重新引入(OutStanding设置失效问题)



    前言

    Iometer 2006.07.27版本在linux系统上一直存在个问题:Iometer的I/O OutStanding 的数值设置没有效果,无法做到异步测试,比如:设置为32的数值,性能测试结果与设置为1相差无几。

    Iometer 1.1.0 版本已经修复这个存在8年多的严重BUG(xca1019 2012年合入devel分支),但也不能直接说彻底解决了。这个问题最早是由LIANG YANG提出,并在2006年底得到当时iometer 的维护人MING ZHANG的确认,因为在修改方案上存在分歧,这个问题就一直挂起,没有fix。这个问题的解决与Linux 系统的Asynchronous I/O 实现相关,与它相关的项目开发也一直处于争论、搁置、废弃等状态,到目前已经十年了,也没有见到一个统一的妥善的方案出来,虽然也有大量的非官方补丁发布,但毕竟仍然存在一些风险。

    版本更新

-------------------------

Version 1.1.0 (GA)  ---- 完整changelog文件访问地址:http://sourceforge.net/p/iometer/svn/HEAD/tree/trunk/IOmeter/CHANGELOG.txt

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

- New functionality:

- (Windows) Support for identifying GPT disks with hidden paritions was added.


- Changes/Improvements:

- (All) Expressing Dynamo command line options with Windows style options (/f) is no longer supported. Going forward, only Unix style options (-f or --foo) are available.

- (All) Non-standard Dynamo command line options used for tuning or activating alternative code paths (-force_raw and -use_rdtsc) are now consolidated in the new --flag option.


- Bug fixes:

- (Linux) The O_DIRECT flag was reintroducted for opening targets under Linux.

- (Linux) Patch by Jinpyo Kim enabling the use of libaio on Linux. The code path is controlled by IOMTR_SETTING_LINUX_LIBAIO and is enabled by default.

- (Linux) Removed stropts.h include for Linux, as this file is no longer available with newer Linux distributions.

- (OS X) Specialized the OS X makefile (Makefile-OSX.all) into Makefile-OSX.ppc and Makefile-OSX.i386, because otherwise builds on x86 are breaking due to the CPU architecture specific timer code.

- (All) Patch by Ryan Bever to fix the version check being performed when loading a ICF files. The new version format caused the check to fail when loading ICF files that were written by former versions of Iometer (see Bug Tracker ID 3141394).

- (All) Patch by Daniel Scheibli to fix the PROCESSOR row format in the CSV file output (see Bug Tracker ID 3141400).

- Documentation:

- Converted Iometer User's Manual from Star Office based file (.sxw) to the Open Document Format (.odt)

- Others:

- (All) Reimplementation of handing of Dynamo command line option handling and the related help output (aka Syntax() function).

- (All) Minor changes to the initial puslar output. In particular the processor family information were cleaned up.

- Appended .txt extension to the capital letter files (CHANGELOG etc.)

- Rework of CHANGELOG file to clarify changes since version 2006.07.27.

------------------------

  • 现象描述

    采用Iometer 2006.07.27版本,在linux 系统上跑dynamo,这时对Iometer GUI界面的OutStanding I/O 数值无论设置为多少,性能数据均与设置为1时表现相当。并且Iometer 不管是采用Disk I/O(RAW),还是采用File I/O(Buffered/Cache)的读写场景。


  • 原因解释

    Iometer 2006.07.27版本中针对IOMTR_OS_LINUX类型的操作系统的磁盘I/O读写是采用异步IO方式(AIO)。Linux 系统的异步I/O实现方式主要是POSIX AIO和Native Kernel AIO两种。

    这个Iometer版本的作者选择的是Glibc实现方式,而用户态的Glibc 实现异步I/O,是通过线程与线程之间可以异步工作的特性,使用新线程来完成多个异步I/O请求,最终模拟出异步I/O的处理。但是,这种实现存在一个问题,即是同一个fd的读写请求是由同一个异步处理线程来完成的,并且该异步处理线程是逐个处理这些请求。对于IO Scheduler 来说,它每一次只能处理一个请求,当该请求处理完毕之后,异步处理线程才会提交下一个(根据优先级排序)。Iometer 的OutStanding I/O (被选中Worker的每一磁盘一次允许的未处理的异步I/O数量,也叫队列深度)设置数值大于1时,由于采用Glibc实现方式,故所有异步I/O请求都是逐个处理,这样实际运行结果也就和OutStanding I/O 数值设置为1一致,甚至某些时候还略有降低(CPU资源紧张时)。

    补充说明一下:针对IOMTR_OS_LINUX类型,iometer 2006.07.27和1.1.0 GA版本都设置了O_DIRECT Flag。changelog中说重新引入,不知道是参照从哪个rc版本来说的。该Flag的设置,意味着IO请求绕过文件系统缓存,直接访问磁盘设备。故,iometer 不适合测试Linux 系统下的各种文件系统性能。


  • 1.1.0版本AIO新方案

    iometer 1.1.0 GA版本已经正式采用Native kernel AIO方式,抛弃了争议颇多的Glibc AIO方式。

    该方式允许所有IO请求直接提交给I/O Scheduler。当I/O请求数较多时,I/O Scheduler 采用不同的电梯算法来处理这些请求。但是Kernel AIO 目前支持Direct IO模式,而非Direct IO(buffer/cache)因为会增加block points,无法做到非阻塞。

    iometer 1.1.0 GA版本采用了Linux Kernel AIO方式,同时仅支持Direct IO。所以说,该版本也并非完美的异步IO解决方案应用。但是,由于iometer 仅关注RAW 设备性能,所以即便目前AIO不支持Buffered IO,也没有什么大的影响。如果非要考虑存储系统cache 对性能的影响大小,可以采用其他的IO测试工具,如vdbench;也可以自行patch iometer 源代码。

    iometer 1.1.0 GA 版本的IOCommon.h 文件中对aio的调用情况:

#elif defined(IOMTR_OS_LINUX) || defined(IOMTR_OS_SOLARIS)
  #include 
  #include 
  #ifdef IOMTR_SETTING_LINUX_LIBAIO
   #include 
  #endif
 #else
  #error ===> ERROR: You have to define exactly one IOMTR_CPU_* global define!
 #endif

    iometer 2006.07.27 与1.1.0 GA 版本IOTargetDisk.cpp 函数对比图:


iometer 1.1.0 重要特性说明之O_DIRECT flag重新引入(OutStanding设置失效问题)_第1张图片

    说明:

    虽然在1.1.0 版本中设置了打开和关闭AIO 的开关,但是默认都是使能打开的。

--------------

    iometer 1.1.0 GA 版本引入IOMTR_SETTING_LINUX_LIBAIO,来自IOCompletionQ.cpp文件:


iometer 1.1.0 重要特性说明之O_DIRECT flag重新引入(OutStanding设置失效问题)_第2张图片


参考:

1、http://sourceforge.net/p/iometer/mailman/iometer-user/thread/[email protected]/

2、http://stackoverflow.com/questions/8768083/difference-between-posix-aio-and-libaio-on-linux

3、http://stackoverflow.com/questions/5664105/buffered-asynchronous-file-i-o-on-linux

4、http://stackoverflow.com/questions/6918530/linux-kernel-aio-functionality

5、http://blog.libtorrent.org/2012/10/asynchronous-disk-io/

6、http://sourceforge.net/p/iometer/svn/136/

7、http://www.wzxue.com/linux-kernel-aio%E8%BF%99%E4%B8%AA%E5%A5%87%E8%91%A9/

8、http://www.ibm.com/developerworks/library/l-async/index.html

9、http://stackoverflow.com/questions/8513663/linux-disk-file-aio

10、https://cnodejs.org/topic/4f16442ccae1f4aa270010a7

11、http://blog.yufeng.info/archives/741

12、http://blog.sina.com.cn/s/blog_63ce05ca01010pb9.html

13、http://hi.baidu.com/_kouu/item/4e9db87580328244ef1e53d0

你可能感兴趣的:(Cloud_Computing,iometer,O_DIRECT,flag,OutStanding)