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的确认。因为在方案解决上存在分歧,最终这个问题没有得到解决。这个问题的解决与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 <malloc.h>
  #include <aio.h>
  #ifdef IOMTR_SETTING_LINUX_LIBAIO
   #include <libaio.h>
  #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 函数对比图:

说明:

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

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

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

参考:

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

时间: 2024-10-25 21:59:57

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

iometer 1.1.0 重要特性说明之Write IO Data Pattern

iometer 1.1.0 版本包含了3种Write IO Data Pattern.分别是:Repeating bytes.Pseudo-Random (2006.07.27及其之前的版本默认) 和 Full random.实际上这三种IO数据类型的代码在1.1.0 rc1 就已经合入. ------------------- Version 1.1.0 (RC1)===================- New features:- (All) Different data randomiz

Day07 jdk5.0新特性&Junit&反射

day07总结 今日内容 MyEclipse安装与使用 JUnit使用 泛型 1.5新特性 自动装箱拆箱 增强for 静态导入 可变参数方法 枚举 反射 MyEclipse安装与使用(yes) 安装MyEclipse 先安装了JDK ? MyEclipse介绍 ? MyEclipse是Eclipse的一个插件: MyEclipse是需要花钱的: MyEclipse官网不在欢迎中国人登录: ? MyEclipse使用 ? 1 创建项目 选择工作空间: 工作空间路径不能有空格和中文: 工作空间以班名

Atitit.&#160;C#.net&#160;clr&#160;2.0&#160;&#160;4.0新特性

Atitit. C#.net clr 2.0  4.0新特性 1. CLR内部结构1 2. CLR 版本发展史3 3. CLR 2.0 3 4. CLR 4 新特性 概览4 4.1.1.  托管与本地代码的互操作5 4.1.2.    垃圾回收6 4.1.3.    代码约定6 4.1.4.    Corrupted state exception6 4.1.5.     新的安全模型7 4.1.6.     同一个进程,多个CLR7 4.1.7.     基本类库7 5. CLR最新发展8 6

day07 MyEclipse 安装 jdk5.0 新特性

1.myeclipse的安装和使用 * eclipse:是一个免费的开发工具    * myeclipse:是一个收费的插件,破解myeclipse,        ** 安装目录的要求: 不能有中文和空格        ** 安装完成之后,选择一个工作空间 ,这个工作空间不能有中文和空格    * 破解myeclipse        ** 运行run.bat文件,但是运行之前,必须要安装jdk,通过配置环境变量 * myeclipse的使用        * 创建一个工程          

AFNetworking 2.0 新特性讲解之AFHTTPSessionManager

AFNetworking 2.0 新特性讲解之AFHTTPSessionManager (2014-02-17 11:56:24) 转载▼     AFNetworking 2.0 相比1.0 API 接口改动还是很大的. 其中一个便是 AFURLSessionManager,当然如果你不太熟悉,或者为了兼容低版本,你依然可以选择AFHTTPRequestOperationManager,AFURLSessionManager是基于 NSURLSessionConfiguration(IOS 7

Servlet 3.0 新特性详解

转自:https://www.ibm.com/developerworks/cn/java/j-lo-servlet30/ Servlet 3.0 新特性详解 张 建平2010 年 4 月 23 日发布 WeiboGoogle+用电子邮件发送本页面 6 Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署.其

android 7.0 新特性 和对开发者的影响

android 7.0新特性 - jiabailong的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/jiabailong/article/details/52411300 android 7.0对开发者会有哪些影响 - jiabailong的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/jiabailong/article/details/52411353 android 7.0 多窗口及新特性demo - jiabail

C#6.0新特性

C#6.0新特性怎么用 系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 前文提到过一个神器叫Resharper,功能强大,编码效率和代码质量那是蹭蹭的涨,但是神器的最大问题是太耗费资源了,每次系统提示内存不足的时候,那叫一个纠结啊.因此每次新的VS发布的时候都情不自禁的查看是否增强编辑功能,情不自禁的讨论一番,这次VS2015也不例外. 去年微软放出Roslyn的时候,微软就曾经放出过一个“尝鲜”版的VS编辑增强功能,恰恰就是重构(reflector),话说这

ASP.NET MVC—1、前期知识储备(C#3.0新特性)

在学习ASP.NET MVC之前,有必要先了解一下C#3.0所带来的新的语法特性,这一点尤为重要,因为在MVC项目中我们利用C#3.0的新特性将会大大的提高我们的开发效率,同时,在MVC项目中你将到处可以看到C#3.0新特性的身影. C#3.0新特性 自动属性 隐式类型 var 对象初始化器与集合初始化器 匿名类 扩展方法 Lambda表达式 自动属性 这个概念很简单,其简化了我们在.NET的时候手写一堆私有成员+属性的编程方式,我们只需要使用如下方式声明一个属性,编译器会自动生成所需的成员变量