AIO, DIO, CIO

这些名词都用于数据(文件)访问的模式,既应用程序用什么方案实现对文件的读写。

AIO
AIO 的全称为 Asynchronous I/O,既异步 I/O。在 AIO 的工作模式下,应用程序发起(call)I/O请求(读 / 写)系统调用以后,内核不必等 I/O 完成,即可返回(此时数据区不能释放或修改,需要等访问确认完成),应用程序可以发起新的 I/O 请求。通过这种方法,可以提示提升 I/O 吞吐量和性能。从 AIX5L 起,AIX 支持两种 AIO:legacy AIO 和 POSIX AIO。AIO 既支持文件系统也支持裸设备。

DIO
AIO 的全称为 Direct I/O,即直接 I/O。在 DIO 的工作模式下,数据直接从磁盘传送到应用的数据区,而不经过文件的 VMM映射。DIO 是 JFS/JFS2文件系统的一个选项,对于一些应用,如 Oracle 数据库,它本身有自己的缓存管理机制,如果再使用文件系统缓存,不但多占用了一倍的物理内存,而且多了一次数据移动。在这种情况下,使用 DIO 会提升一些性能。但是,当应用有大量的顺序读 I/O 的时候,可能由于AIX的lv预读机制也由于DIO而被关闭,导致性能稍稍下降。

CIO
CIO 的全称为 Concurrent I/O 既并发 I/O。CIO 的工作模式是建立在 DIO 模式基础之上的。在 JFS2 的环境下,如果应用需要绕过文件系统缓存,经常会使用 CIO 模式来替代 DIO 模式。在 CIO 的工作模式下,首先,数据会从磁盘直接传递到应用的缓存,这一点和DIO相同。除此之外,由于在文件系统中,为了保证并行访问时,多线程、进程之间数据更新的一致性,需要使用 inode lock。Inode lock 保证一个文件在某一时刻,只有一个写 I/O,并且为了避免读到 stale 的数据,写的时候也是不允许并发读。而在 CIO 的工作模式下,JFS2 会绕过 inode lock,从而实现多个线程可以同时读写一个共享文件。而在这种情况下,数据的一致性就需要应用或数据库自己来保证。

AIO、DIO、CIO 的区别
AIO,使得应用的单一线程就可以同时发起多个IO请求,否则在一个指令流中,前一个IO没有完成返回,就会挂在这里,无法继续执行,更不能发起下一个IO请求。AIO模式则解决了这个问题,由AIO server(由kernel提供)管理请求队列,即刻可以返回IO,当然,应用程序需要自己准备好回调函数,以应对IO失败处理、IO完成后释放数据区等工作;

简单地说,DIO就是减少了AIX内核对文件进行内存映射过程,也就不存在kernel管理的文件缓存,由应用直接管理。由此可以降低内存消耗和kernel管理该内存的CPU的处理需求。前提条件是应用能管理好文件IO,不需要AIX内核对此文件的缓存进行管理。

CIO=DIO+inode lock free,应用不但不需要AIX管理文件cache,而且连并行锁都自行管理。

以上三种IO模式,AIO多全操作系统生效,开启后只要应用打开文件时设置aio参数即可;CIO和DIO则是对一个完整文件系统生效,需要在mount某个文件系统的时候增加mount参数。

AIO CIO DIO

<$$>

AIO 控制的是 读写是顺序的,还是异步的

Dio 控制的是否跳过文件缓存 (即可能是顺序也可以是异步)

CIO 是在DIO 基础上跳过INODE 锁(即可能是顺序也可以是异步)

<$$>

Asynchronous I/O ,在 AIO 的工作模式下,应用程序向操作系统发起 I/O 请求(读 / 写)以后,不必等 I/O 完成,即可发起新的 I/O 请求。通过这种方法,可以提示提升 I/O 吞吐量和性能。从 AIX5L 起,AIX 支持两种 AIO :legacy AIO 和 POSIX AIO 。AIO 既支持文件系统也支持裸设备。

AIO 对文件系统的支持:APP/DB---AIO---AIOSERVER---storage

AIO 对裸设备的支持:APP/DB---AIXKERNEL---storage

Fastpath 不需要 AIO Server 来处理 I/O 请求,它可以减少 CPU 上下文切换,降低 CPU 开销。

通过控制内核参数开启关闭AIO 功能,AIO 在 AIX6.1 中默认是打开的,它既支持文件系统,也支持裸设备。

AIO 对于裸设备的支持与 CIO 对文件系统支持的方式类似,都是通过“FastPath ”来实现。前者受内核参数 fastpath 控制,后者受内核参数 fsfastpath 控制。在 AIX6.1 中,这两个参数默认都是设置为 1 。

# ioo -F -a |grep -i path
                  aio_fastpath = 1
                aio_fsfastpath = 1
            posix_aio_fastpath = 1
          posix_aio_fsfastpath = 1

AIO 相关的内核参数。

# ioo -F -a |grep -i aio
                    aio_active = 1
                   aio_maxreqs = 65536
                aio_maxservers = 30
                aio_minservers = 3
         aio_server_inactivity = 300
              posix_aio_active = 0
             posix_aio_maxreqs = 65536
          posix_aio_maxservers = 30
          posix_aio_minservers = 3
   posix_aio_server_inactivity = 300
                  aio_fastpath = 1
                aio_fsfastpath = 1
                 aio_kprocprio = 39
              aio_multitidsusp = 1
               aio_sample_rate = 5
         aio_samples_per_cycle = 6
            posix_aio_fastpath = 1
          posix_aio_fsfastpath = 1
           posix_aio_kprocprio = 39
         posix_aio_sample_rate = 5
   posix_aio_samples_per_cycle = 6
#

配置可以使用可以使用 chdev 命令或者 smit fastpath 来修改参数

<$$>

DIO 的全称为 Direct I/O ,即直接 I/O 。在 DIO 的工作模式下,数据直接从磁盘传送到应用的缓存,而不经过文件的 buffer cache 。

通过控制文件系统属性来开启关闭DIO 功能。

#mount -o cio /xxx

chfs -a options=rw,cio /xxx

<$$>

CIO 的全称为 Concurrent I/O 即并发 I/O 。CIO 的工作模式是建立在 DIO 模式基础之上的。

从 AIX 5.2.10 开始,JFS2 支持 CIO 选项, 并发 I/O 的实现允许多个线程并发地对同一个文件进行读写数据的操作。 在DB2系统里建表空间的时候默认是关闭文件缓存的,就打开了cio功能。 。

#mount -o dio /xx

chfs -a options=rw,dio /xxx

在v95之后创建表空间的只要文件系统支持或者使用裸设备表空间默认是文件系统选项关闭的,是使用CIO/DIO的。

所以目前容器使用裸设备或者文件系统的在性能方面差别很小了,但是文件系统便于管理,但是还是点差别,文件系统会多一层AIOSERVER,在CPU使用上会更高点(只是一点点),另外在扩展表空间的时候使用裸设备要快些(因为格式化的原因)。

几种 I/O 类型概念的介绍

AIO

AIO 的全称为 Asynchronous I/O,即异步 I/O。在 AIO 的工作模式下,应用程序向操作系统发起 I/O 请求(读 / 写)以后,不必等 I/O 完成,即可发起新的 I/O 请求。通过这种方法,可以提示提升 I/O 吞吐量和性能。从 AIX5L 起,AIX 支持两种 AIO:legacy AIO 和 POSIX AIO。AIO 既支持文件系统也支持裸设备。

DIO

AIO 的全称为 Direct I/O,即直接 I/O。在 DIO 的工作模式下,数据直接从磁盘传送到应用的缓存,而不经过文件的 buffer cache。DIO 是 JFS 文件系统的一个选项,对于一些应用,如 Oracle 数据库,它本身有自己的缓存,如果再使用文件系统缓存,反而会造成性能的下降,在这种情况下,使用 DIO 会提升一定的性能。但是,当应用有大量的顺序读 I/O 的时候,使用 DIO 的方式由于缺少读缓存,会造成一定的性能下降。

CIO

CIO 的全称为 Concurrent I/O 即并发 I/O。CIO 的工作模式是建立在 DIO 模式基础之上的。在 JFS2 的环境下,如果应用需要绕过文件系统缓存,经常会使用 CIO 模式来替代 DIO 模式。在 CIO 的工作模式下,数据会从磁盘直接传递到应用的缓存。从 AIX 5.2.10 开始,JFS2 支持 CIO 选项。

我们知道,在文件系统中,为了保证数据和文件系统的一致性,需要使用 inode lock。Inode lock 保证一个文件在某一时刻,只有一个写 I/O,并且为了避免读到 stale 的数据,写的时候并发读也是不被允许的。

而在 CIO 的工作模式下,JFS2 会绕过 inode lock,从而实现多个线程可以同时读写一个共享文件。而在这种情况下,数据的一致性就需要应用或数据库来提供,如 DB2 Pure Scale、Oracle RAC。

AIO、DIO、CIO 的区别

AIO 在 AIX6.1 中默认是打开的,它既支持文件系统,也支持裸设备。而 DIO 和 CIO 是文件系统的一个选项。我们可以在 mount 文件系统的时候,进行设置,执行命令如下 :

 #mount -o dio /xxx #mount -o cio /xxx

复制

对于已经挂载的文件系统,也可以修改其 I/O 方式 :

 # chfs -a options=rw,dio /xxx# chfs -a options=rw,aio /xxx

复制

DIO 与 CIO 本质上并不矛盾,均属于“绕过文件系统缓存”的 I/O 方式。不同的是,在 DIO 的工作模式下,文件系统中的数据一致性是通过 inode lock 来实现的;而 CIO 为了提高文件的并发读写性,会绕过 inode lock,让应用来提供文件一致性锁。

AIO 对于裸设备的支持与 CIO 对文件系统支持的方式类似,都是通过“FastPath”来实现。前者受内核参数 fastpath 控制,后者受内核参数 fsfastpath 控制。在 AIX6.1 中,这两个参数默认都是设置为 1。

 # ioo -F -a |grep -i path aio_fastpath = 1aio_fsfastpath = 1

复制

三种 I/O 方式的逻辑关系如下图:

图 1.I/O 方式逻辑图

回页首

AIO 的参数设置与调优

AIO 的两种支持方式

在上文中我们已经提到过,AIO 既支持文件系统,也支持裸设备。在文件系统模式下,AIO 通过文件系统缓存来实现异步 I/O。在裸设备的模式下,AIO 通过“FastPath”来实现,它的作用是将原始逻辑卷直接传递到磁盘层的 AIO 请求。在 AIX6.1 中,这个参数是默认打开,设置为 1。

 # ioo -F -a |grep -i path aio_fastpath = 1

复制

AIO 对文件系统的支持逻辑图如下(通过 Kproc 即 AIO Server 处理 I/O)。在这种工作模式下,将会由 kproc 进程来控制 I/O 请求,而 kproc 的数量(即 AIO Server 的数量)将会决定系统处理的最多 AIO 请求的数量。

图 2.AIO 支持逻辑图

AIO 对裸设备的支持逻辑图如下(通过 FastPath 处理 I/O):

图 3.AIO 支持逻辑图

Fastpath 不需要 AIO Server 来处理 I/O 请求,它可以减少 CPU 上下文切换,降低 CPU 开销。

AIO 的主要内核参数

在 AIX6.1 中,使用 ioo 命令可以查看与 AIO 相关的内核参数。

 # ioo -F -a |grep -i aio aio_maxreqs = 131072 aio_maxservers = 30 aio_minservers = 3

复制

kproc 的最小值由系统参数 minservers 决定,最大值由系统参数 maxservers 决定。如果异步 I/O 请求的数量很多,就需要将 maxservers 的数值增大。由于 AIX 内核可以自动生成额外的 kproc,因此在大多数情况下,minservers 的数值不需要手动调整。需要注意的是,minservers 和 maxservers 两个参数只对文件系统有效,对于 AIO 的裸设备模式以及 CIO 的模式是无效的,这两种 I/O 由 FastPath 来处理,而不是 kproc。

在 AIX6.1 中,aio_maxservers 和 aio_minservers 的默认数值分别为 30 和 3,一般认为这两个数值是每个 CPU 的 AIO Server 数量设置。

AIX6.1 中的 maxreqs 参数决定 AIO 系统里可以处理最多并发 I/O 请求的数量。这个参数对于 fast path 的 I/O 类型是不起作用的。我们在调整 minservers 和 maxservers 参数时,也需要监控 maxreqs 数值。

在 AIX6.1 中,可以用如下命令查看运行的 AIO Server 的数量:

 # pstat -a |grep -c aios |wc -l 1 # ioo -F -a |grep -i aio_minservers aio_minservers = 3

复制

 # pstat -a |grep -c kproc |wc -l 1

复制

从上面结果可以看出,目前系统中的 AIO 请求很少,只有一个 AIO server 在运行。而 AIO server 的数量与 kproc 的数量,是一致的。

在系统中,如果 maxreqs 和 maxservers 设置的太低低,可能会造成数据库报错或者宕机,查看 Oracle 的 bdump 文件可以发现如下报错:

图 4.Oracle 报错

aio_server_inactivity 参数控制的是 AIO Server 的退出时间:即当 AIO server 空闲的时间超过 aio_server_inactivit 设置的数值时,AIO server 将会退出,默认这个数值默认为 300 秒。

一般情况下,运行的 AIO Server 数量不会低于 aio_minservers 参数的设置,在上面的例子中,之所以出现 AIO Server 的数量低于 aio_minservers 参数设置的数值,是因为该系统是一个空闲的系统,没有任何负载和 AIO 请求。aio_server_inactivity 在 AIX6.1 中一般不需要设置。

aio_active 参数不需要设置,默认为 0。只有当 AIO kernel extensors 被使用时,才会变成 1。

 # ioo -a | grep active aio_active = 0 posix_aio_active = 0 # ioo -o aio_active=1 ioo: 1485-114 Static tunable aio_active cannot be changed

# ioo -F -a |grep -i path
                  aio_fastpath = 1
                aio_fsfastpath = 1
            posix_aio_fastpath = 1
          posix_aio_fsfastpath = 1
# ioo -a | grep active 
                    aio_active = 1
              posix_aio_active = 0

如何判断 AIO 性能问题

在 AIX 操作系统中,可以通过系统命令查看 AIO 是否存在性能问题 :

 # iostat -A 1 3 |grep -v hdisk

复制

图 5.AIO 性能监控

在上面的命令中,我采用的监控时间是 1 秒,因此下面几个数值的描述都是“每秒”。

用红框标注的几个数值需要关注:

avgc: 每秒全局非 FastPath AIO 平均请求数量。如果 iostat 命令时间间隔为 3 秒,那么此项描述应为:3 秒内全局非 FastPath AIO 请求的平均数量,下不赘述。

avfc: 每秒裸设备(不包括 CIO FastPath IOs)FastPath AIO 平均请求数量。

maxgc:1 秒内,非 FastPath AIO 达到的最大值。

maxfc: 1 秒内,FastPath AIO 达到的最大值。

maxreqs: 参数设定的系统最大允许的 AIO 请求数量。

在命令的输出结果中,如果 maxgc 或 maxfc 的数值接近 maxreqs 或 maxservers 的数值,那么就需要增大系统中 maxreqs 或 maxservers 设置。

AIO 内核参数设置的方法

在 AIX6.1 中,可以用 ioo 命令设置相关的参数。例如我们将 AIO Server 最大值设置为 40,最小值设置为 10:

 # ioo -p -o aix_maxservers=40 -o aio_minservers=10 ioo: 1485-110 Invalid tunable name aix_maxservers Setting aio_minservers to 10 in nextboot file Setting aio_minservers to 10

复制

我们将 maxreqs 的数值设置为 666666

 # ioo -p -o aio_maxreqs=666666 Setting aio_maxreqs to 666666 in nextboot file Setting aio_maxreqs to 666666

复制

设置 fast path 参数,1 为打开,设置为 0 则关闭:

 # ioo -o aio_fastpath=1  Setting aio_fastpath to 1 Warning: a restricted tunable has been modified # ioo -o aio_fsfastpath=1 Setting aio_fsfastpath to 1 Warning: a restricted tunable has been modified

复制

一般情况下,对于常见的应用,主要参数建议设置的数值为:

表 1. 参数设置建议值

默认值

OLTP

SAP

aio_minservers

3

200

400

aio_maxservers

10

800

1200

maxreqs

4096

16384

16384

回页首

总结

AIO 在 AIX6.1 及 AIX7.1 中已默认开启,不需要手动开启。AIO 对于数据库而言是很重要的,如果参数设置的不对,将会造成性能大幅下降。因此,在规划数据库或者进行数据库调优时,应充分考虑到 I/O 的方式以及相关参数的设置。

AIX AIO, DIO, CIO相关推荐

  1. AIX 操作系统中AIO、DIO、CIO 的相关概念介绍 (一)

    aio.cio.dio无论关于操作系统还是数据库中都经常提到的概念,在IBM的官方网站可以查到相关详细的资料这里我只简单的介绍下,便于大家平时看资料时候更好理解相关概念 AIO CIO DIO < ...

  2. aix oracle 10.2.0.1 升级 10.2.0.4,安装oracle 10.2.0.4 on aix 6.1的不同之处

    根据Oracle Database Installation Guide 10g Release 2 (10.2) for AIX 5L Based Systems (64-Bit)文档,在AIX 6 ...

  3. Warning: lio_listio returned EAGAIN Performance degradation may be seen

    Warning: lio_listio returned EAGAIN Performance degradation may be seen. WARNING:Oracle process runn ...

  4. 讨论 innodb_log_block_size 变量

    这不是一篇独创性的文章,但如果你对进一步了解 innodb_log_block_size 变量感兴趣,或者你在ext4文件系统上使用SSD卡和/或InnoDB大日志文件,这篇文章为你而写. 我以前会简 ...

  5. 【译】Linux不同的IO访问方式中,Scylla的选择和依据

    [原文]http://www.scylladb.com/2017/10/05/io-access-methods-scylla/ [译文] 大多数服务应用开发者考虑IO时会重点考虑网络IO,因为他们访 ...

  6. AIX 操作系统中AIO、DIO、CIO 的相关概念介绍 (二)

    AIO AIO 的全称为 Asynchronous I/O,即异步 I/O.在 AIO 的工作模式下,应用程序向操作系统发起 I/O 请求(读 / 写)以后,不必等 I/O 完成,即可发起新的 I/O ...

  7. linux裸设备文件系统,关于裸设备,文件系统,CIO/DIO

    我们在创建DMS表空间容器时可以选择使用裸设备或文件系统,下面我们来看看两者的区别.我们知道,内存的读写效率比磁盘高近万倍,因此数据库通常会在内存中开辟一片区域,称为Buffer Pool,使数据的读 ...

  8. AIX 6.1 异步 I/O 的 配置与性能评估

    几种 I/O 类型概念的介绍 AIO AIO 的全称为 Asynchronous I/O,即异步 I/O.在 AIO 的工作模式下,应用程序向操作系统发起 I/O 请求(读 / 写)以后,不必等 I/ ...

  9. AIX 常用操作命令

    1. 常用命令操作 ITPUB个人空间m~Y)Zf4l(}g;N #prtconf --AIX服务器物理结构信息 ITPUB个人空间%R}`,q%m_!f)jX #lscfg -l hdisk0 -- ...

最新文章

  1. 浅谈几种区块链网络攻击以及防御方案之51#37攻击
  2. cad四边形展开lisp_批量绘制四边形 - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...
  3. 使用fswatch工具进行golang的热编译
  4. java和js的正则表达式一样吗_JavaScript与Java正则表达式写法的区别
  5. 计算机录入的课程标准,《计算机录入技术》课程标准.doc
  6. 利用 test 命令的测试功能
  7. 子串字谜substring anagrams
  8. 通过 Java 线程堆栈进行性能瓶颈分析
  9. 【数据结构与算法】之深入解析“根据身高重建队列”的求解思路与算法示例
  10. 数学界的高冷之王,N次拒绝巨额奖金:我穷,但是我不缺钱。。。
  11. 从位图数据取得位图句柄
  12. JAVA入门级教学之(final关键字)
  13. resnet18实现cifar10分类
  14. DxO PhotoLab 5 for mac(raw图片处理软件)
  15. Linux内核那些事之连接跟踪
  16. 最短路径(状压dp)(ybtoj)
  17. 计算机公式与函数有何区别,Excel中公式和函数的区别/excle中的函数公式
  18. 今有物不知其数三三数之JAVA_今有物不知其数,三三数之剩二,五五数之剩三,七七数...
  19. 微信 心理测试 软件,敢不敢做一份微信版心理测试?
  20. 为自己的站点实现访客统计

热门文章

  1. 《如何在WordPress上添加微信/支付宝打赏功能》
  2. Angular防抖设计——点击事件
  3. 请问这个动态表格的表单内容如何写才能存入ACCess数据库中
  4. 盛科推出新一代超融合网络交换机E550系列
  5. 跟着阿杜拆书:《慢思考》
  6. maven中依赖变黄并提示Show vulnerabilities info for xxx.xxxx.xxxx:protobuf-java:3.11.4
  7. 汉白玉产地在哪里_汉白玉产地是在哪里,有哪些种类?
  8. 2023年FOF/MOM基金研究报告
  9. 矿大计算机考研学硕,【经验贴】2020中国矿业大学(北京)会计学学硕考研经验...
  10. Day9 :面向对象进阶