实践真知:使用ASM和文件系统的数据库在AIO上有何不同?

张大朋(Lunar)Oracle 资深技术专家

Lunar 拥有超过十年的 ORACLE SUPPORT 从业经验,曾经服务于ORACLE ACS部门,现就职于 ORACLE Sales Consultant 部门,负责的产品主要是 Exadata,Golden Gate,Database 等。

编辑说明:在Oracle数据库中,很多概念在悄悄的发生变化,而如果缺乏实践和动手验证,你可能离真相会越来越远。从文件系统到ASM,Oracle的异步IO参数也在发生不断变化。

昨天客户的一个重要应用切换到新的系统环境上,今天观察,发现部分异常等待:


从OS的CPU负载来看,定期会出现一个峰值,从ASH中可以看出,这个峰值对应的等待事件跟AWR的完全吻合。

因此,主要怀疑两个东西:

1,应用的SQL和对象的属性(比如table或者index的统计信息,并行度等等……) 2,系统的AIO设置


上面的第一条,已经提交给开发相应的SQL和其他信息;第二条,因为系统以前是11.2 RAC,使用了ASM,而现在是单机文件系统.


因此对比了这两种环境下AIO的异同,结论如下1,Linux下,ASM数据库和文件系统数据库的AIO设置差别: ----(1). ASM的AIO属性是不受 FILESYSTEMIO_OPTIONS 参数的影响(因为ASM会绕过文件系统buffer),只跟DISK_ASYNCH_IO有关系 ----(2). 文件系统的AIO属性跟 FILESYSTEMIO_OPTIONS 和 DISK_ASYNCH_IO 都有关系

2,FILESYSTEMIO_OPTIONS=NONE : Bug 6733627 – Unaccounted Wait Time on “Direct Path” operations with FILESYSTEM_IO_OPTIONS=NONE (Doc ID 6733627.8)

3, db file async I/O submit’相关内容: ‘db file async I/O submit’ when FILESYSTEMIO_OPTIONS=NONE (Doc ID 1274737.1) —详细讲述了 ‘db file async I/O submit’ 和 FILESYSTEMIO_OPTIONS=NONE的关系 当文件系统设置了FILESYSTEMIO_OPTIONS=NONE时,会出现“db file async I/O submit”后台等待事件,而正常应该是出现“db file parallel write” 可以通过设置 FILESYSTEMIO_OPTIONS=SETALL,启用AIO,然后在AWR中会出现db file parallel write,而不再是db file async I/O submit

4,FILESYSTEMIO_OPTIONS=DIRECTIO : Wrong FILESYSTEMIO_OPTIONS Settings Can Cause a Corrupted Block to be Returned at the First Read (Doc ID 1918825.1)

5,一般,linux建议设置为 FILESYSTEMIO_OPTIONS=SETALL


具体测试过程如下:

先看看官方文档的描述:

FILESYSTEMIO_OPTIONS--------------------------------Property DescriptionParameter type StringSyntax FILESYSTEMIO_OPTIONS = { none | setall | directIO | asynch }Default value Varies by database version and operating system.Modifiable NoBasic No DISK_ASYNCH_IO------------------------------Property DescriptionParameter type BooleanDefault value trueModifiable NoRange of values true | falseBasic No

此处是文件系统:filesystemio_options=none disk_asynch_io=true(缺省值),使用strace发现,没有启用AIO:

15:21:06 SYS@ Lunar> show parameter filesystemio_options NAME TYPE VALUE------------------------------------ ----------- ------------filesystemio_options string none15:21:16 SYS@ Lunar> show parameter DISK_ASYNCH_IO NAME TYPE VALUE------------------------------------ ----------- ------------disk_asynch_io boolean TRUE15:21:30 SYS@ Lunar>

在系统上看,目前并没有启用AIO:

[oracle@Lunar tmp]$ cat /proc/slabinfo | grep kiokioctx 140 384 320 12 1 : tunables 54 27 8 : slabdata 31 32 22kiocb 0 0 256 15 1 : tunables 120 60 8 : slabdata 0 0 0[oracle@Lunar tmp]$

使用strace对后台进程DBWR进行跟踪,佐证了上述观点,当前文件系统的数据库没有启用AIO:

[oracle@Lunar tmp]$ ps -ef|grep dbworacle 16540 30146 0 14:50 pts/3 00:00:00 grep dbworacle 20618 1 0 Sep24 ? 00:02:39 ora_dbw0_Lunaroracle 20620 1 0 Sep24 ? 00:02:55 ora_dbw1_Lunaroracle 20622 1 0 Sep24 ? 00:02:47 ora_dbw2_Lunaroracle 20624 1 0 Sep24 ? 00:02:29 ora_dbw3_Lunaroracle 20626 1 0 Sep24 ? 00:02:48 ora_dbw4_Lunaroracle 20628 1 0 Sep24 ? 00:02:41 ora_dbw5_Lunaroracle 20630 1 0 Sep24 ? 00:02:44 ora_dbw6_Lunaroracle 20632 1 0 Sep24 ? 00:02:55 ora_dbw7_Lunaroracle 20634 1 0 Sep24 ? 00:02:06 ora_dbw8_Lunaroracle 20636 1 0 Sep24 ? 00:01:46 ora_dbw9_Lunaroracle 20638 1 0 Sep24 ? 00:01:56 ora_dbwa_Lunaroracle 20640 1 0 Sep24 ? 00:01:58 ora_dbwb_Lunaroracle 20642 1 0 Sep24 ? 00:01:52 ora_dbwc_Lunaroracle 20644 1 0 Sep24 ? 00:01:57 ora_dbwd_Lunaroracle 20646 1 0 Sep24 ? 00:01:50 ora_dbwe_Lunaroracle 20648 1 0 Sep24 ? 00:01:50 ora_dbwf_Lunar

strace中,没有io_submit函数,因为 filesystemio_options = none 如果 filesystemio_options = setall ,那么会出现 io_submit函数。

下面的测试是使用ASM的数据库的参数:

15:24:25 SYS@ Lunardb1> show parameter FILESYSTEMIO_OPTIONS NAME TYPE VALUE------------------------------------ ----------- --------------filesystemio_options string none15:24:29 SYS@ Lunardb1> show parameter DISK_ASYNCH_IO NAME TYPE VALUE------------------------------------ ----------- -------------disk_asynch_io boolean TRUE15:24:39 SYS@ Lunardb1>

在系统上看,虽然设置了FILESYSTEMIO_OPTIONS=NONE,但是由于DISK_ASYNCH_IO=TRUE(缺省值),因此,ASM下的数据库依然使用AIO:

[root@Lunardb1 ~]# cat /proc/slabinfo | grep kiokioctx 238 340 384 10 1 : tunables 54 27 8 : slabdata 34 34 0kiocb 3656 4845 256 15 1 : tunables 120 60 8 : slabdata 323 323 180[root@Lunardb1 ~]# [oracle@Lunardb1 ~]$ ps -ef|grep dbworacle 82860 82820 0 15:25 pts/1 00:00:00 grep dbwgrid 85795 1 0 Sep25 ? 00:00:36 asm_dbw0_+ASM1grid 86406 1 0 Sep25 ? 00:01:32 /u01/app/11.2.0/grid/jdk/jre//bin/java -server -Xcheck:jni -Xms128M -Xmx384M -Djava.awt.headless=true -Ddisable.checkForUpdate=true -Dstdstream.filesize=100 -Dstdstream.filenumber=10 -DTRACING.ENABLED=false -Doracle.wlm.dbwlmlogger.logging.level=INFO -Dport.rmi=23792 -jar /u01/app/11.2.0/grid/oc4j/j2ee/home/oc4j.jar -config /u01/app/11.2.0/grid/oc4j/j2ee/home/OC4J_DBWLM_config/server.xml -out /u01/app/11.2.0/grid/oc4j/j2ee/home/log/oc4j.out -err /u01/app/11.2.0/grid/oc4j/j2ee/home/log/oc4j.erroracle 87014 1 0 Sep25 ? 00:10:02 ora_dbw0_Lunardb1oracle 87018 1 0 Sep25 ? 00:11:22 ora_dbw1_Lunardb1oracle 87022 1 0 Sep25 ? 00:09:28 ora_dbw2_Lunardb1oracle 87026 1 0 Sep25 ? 00:08:50 ora_dbw3_Lunardb1oracle 87030 1 0 Sep25 ? 00:09:43 ora_dbw4_Lunardb1oracle 87041 1 0 Sep25 ? 00:09:47 ora_dbw5_Lunardb1oracle 87048 1 0 Sep25 ? 00:08:52 ora_dbw6_Lunardb1oracle 87052 1 0 Sep25 ? 00:08:59 ora_dbw7_Lunardb1oracle 87056 1 0 Sep25 ? 00:08:26 ora_dbw8_Lunardb1oracle 87060 1 0 Sep25 ? 00:12:26 ora_dbw9_Lunardb1oracle 87064 1 0 Sep25 ? 00:09:35 ora_dbwa_Lunardb1oracle 87068 1 0 Sep25 ? 00:09:25 ora_dbwb_Lunardb1oracle 87072 1 0 Sep25 ? 00:08:35 ora_dbwc_Lunardb1oracle 87076 1 0 Sep25 ? 00:09:22 ora_dbwd_Lunardb1oracle 87080 1 0 Sep25 ? 00:08:16 ora_dbwe_Lunardb1[oracle@Lunardb1 ~]$

可以看到,使用ASM数据库的dbw0进程,即使FILESYSTEMIO_OPTIONS设置为NONE,只要disk_asynch_io设置为true(缺省值),DBWR也可以使用到AIO:

再看ASM实例的dbw进程,也是用了AIO:

在实践学习中,跟踪工具strace是利器之一。

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2016-05-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Linux运维学习之路

来一波Linux中查看cpu、磁盘、内存、网络的命令

转载请注明出处。 如果想远程管理服务器就有远程管理卡,比如Dell idRAC,HP ILO,IBM IMM 查看硬件的温度/风扇转速,电脑有撸大师,服务器就有...

2068
来自专栏.NET技术

Quartz.NET的使用(附源码)

  虽然Quartz.NET被园子里的大神们写烂了,自己还是整理了一篇,结尾会附上源码地址。

531
来自专栏三杯水

Codis3.2集群HA高可用方案

Sentinel需要使用原生的Redis-server,版本要等于或高于Codis3.2里面的3.2.8版本, 这里是在Redis3.2.9的下配置测试的,另外...

492
来自专栏杂烩

spark整合hive+hbase做数据实时插入及实时查询分析

        使用的spark是2.0.1,hive是1.2.1,hbase是1.2.4,hadoop是2.6.0,zookeeper是3.4.9

594
来自专栏乐沙弥的世界

Percona XtraDB Cluster添加仲裁节点

Galera Arbitrator是Percona XtraDB集群的成员,用于投票,以防您拥有少量服务器(通常为两个)并且不希望添加更多资源。Galera仲裁...

952
来自专栏哈雷彗星撞地球

RunLoop总结:RunLoop的应用场景(四)App卡顿监测

今天要介绍的RunLoop使用场景很有意思,在做长期项目,需要跟踪解决用户问题非常有用。 使用RunLoop 监测主线程的卡顿,并将卡顿时的线程堆栈信息保存下...

682
来自专栏我和未来有约会

Silverlight 2 has a Timer (DispatcherTimer)

在Silverlight 2以前的版本里中有很多不同的方法来模拟Timer.其中最流行的方法就是用StoryBoard来完成.在结束时不停的调用自己. 例如: ...

1929
来自专栏SDNLAB

源码解读ODL的MAC地址学习(二)

1 简介 上一篇文章(源码解读ODL的MAC地址学习(一))已经分析了MAC地址学习中的ARP请求的部分源码,下面将接着上一篇文章,介绍一下ARP响应和生成流表...

3925
来自专栏数据库新发现

关于shared pool的深入探讨(六)

http://www.eygle.com/internal/shared_pool-6.htm

772
来自专栏Netkiller

Apache Sqoop 将mysql导入到Hadoop HDFS

第 21 章 Apache Sqoop 目录 21.1. 安装 Sqoop 21.2. sqoop2-tool 21.2.1. verify 21.2.2. u...

4437

扫描关注云+社区