实践真知:使用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    Description

Parameter type  String

Syntax  FILESYSTEMIO_OPTIONS = { none | setall | directIO | asynch }

Default value   Varies by database version and operating system.

Modifiable  No

Basic   No

 

DISK_ASYNCH_IO

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

Property    Description

Parameter type  Boolean

Default value   true

Modifiable  No

Range of values true | false

Basic   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      none

15:21:16 SYS@ Lunar> show parameter DISK_ASYNCH_IO

 

NAME                                 TYPE        VALUE

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

disk_asynch_io                       boolean     TRUE

15:21:30 SYS@ Lunar>

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


[oracle@Lunar tmp]$ cat /proc/slabinfo | grep kio

kioctx               140    384    320   12    1 : tunables   54   27    8 : slabdata     31     32     22

kiocb                  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 dbw

oracle   16540 30146  0 14:50 pts/3    00:00:00 grep dbw

oracle   20618     1  0 Sep24 ?        00:02:39 ora_dbw0_Lunar

oracle   20620     1  0 Sep24 ?        00:02:55 ora_dbw1_Lunar

oracle   20622     1  0 Sep24 ?        00:02:47 ora_dbw2_Lunar

oracle   20624     1  0 Sep24 ?        00:02:29 ora_dbw3_Lunar

oracle   20626     1  0 Sep24 ?        00:02:48 ora_dbw4_Lunar

oracle   20628     1  0 Sep24 ?        00:02:41 ora_dbw5_Lunar

oracle   20630     1  0 Sep24 ?        00:02:44 ora_dbw6_Lunar

oracle   20632     1  0 Sep24 ?        00:02:55 ora_dbw7_Lunar

oracle   20634     1  0 Sep24 ?        00:02:06 ora_dbw8_Lunar

oracle   20636     1  0 Sep24 ?        00:01:46 ora_dbw9_Lunar

oracle   20638     1  0 Sep24 ?        00:01:56 ora_dbwa_Lunar

oracle   20640     1  0 Sep24 ?        00:01:58 ora_dbwb_Lunar

oracle   20642     1  0 Sep24 ?        00:01:52 ora_dbwc_Lunar

oracle   20644     1  0 Sep24 ?        00:01:57 ora_dbwd_Lunar

oracle   20646     1  0 Sep24 ?        00:01:50 ora_dbwe_Lunar

oracle   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      none

15:24:29 SYS@ Lunardb1> show parameter DISK_ASYNCH_IO

 

NAME                                 TYPE        VALUE

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

disk_asynch_io                       boolean     TRUE

15:24:39 SYS@ Lunardb1>

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


[root@Lunardb1 ~]# cat /proc/slabinfo | grep kio

kioctx               238    340    384   10    1 : tunables   54   27    8 : slabdata     34     34      0

kiocb               3656   4845    256   15    1 : tunables  120   60    8 : slabdata    323    323    180

[root@Lunardb1 ~]#

 

[oracle@Lunardb1 ~]$ ps -ef|grep dbw

oracle    82860  82820  0 15:25 pts/1    00:00:00 grep dbw

grid      85795      1  0 Sep25 ?        00:00:36 asm_dbw0_+ASM1

grid      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.err

oracle    87014      1  0 Sep25 ?        00:10:02 ora_dbw0_Lunardb1

oracle    87018      1  0 Sep25 ?        00:11:22 ora_dbw1_Lunardb1

oracle    87022      1  0 Sep25 ?        00:09:28 ora_dbw2_Lunardb1

oracle    87026      1  0 Sep25 ?        00:08:50 ora_dbw3_Lunardb1

oracle    87030      1  0 Sep25 ?        00:09:43 ora_dbw4_Lunardb1

oracle    87041      1  0 Sep25 ?        00:09:47 ora_dbw5_Lunardb1

oracle    87048      1  0 Sep25 ?        00:08:52 ora_dbw6_Lunardb1

oracle    87052      1  0 Sep25 ?        00:08:59 ora_dbw7_Lunardb1

oracle    87056      1  0 Sep25 ?        00:08:26 ora_dbw8_Lunardb1

oracle    87060      1  0 Sep25 ?        00:12:26 ora_dbw9_Lunardb1

oracle    87064      1  0 Sep25 ?        00:09:35 ora_dbwa_Lunardb1

oracle    87068      1  0 Sep25 ?        00:09:25 ora_dbwb_Lunardb1

oracle    87072      1  0 Sep25 ?        00:08:35 ora_dbwc_Lunardb1

oracle    87076      1  0 Sep25 ?        00:09:22 ora_dbwd_Lunardb1

oracle    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是利器之一。

本文出自数据和云公众号,原文链接

时间: 2024-09-30 10:30:31

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

《SQL Server企业级平台管理实践》读书笔记——关于SQL Server数据库的备份方式

原文:<SQL Server企业级平台管理实践>读书笔记--关于SQL Server数据库的备份方式 数据备份一直被认为数据库的生命,也就是一个DBA所要掌握的主要技能之一,本篇就是介绍SQL Server备份原则,SQL Server数据库分为数据文件和日志文件.为了使得数据库能够恢复一致点,备份不仅需要拷贝数据数据文件里的内容,还要拷贝日志文件里的内容.那么根据每次备份的目标不同,我们可以将备份分为数据备份和日志备份. 数据备份的范围可以是完整的数据库.部分数据库.一组文件或文件组.所以根

使用RMAN在ASM和文件系统之间拷贝数据

        这篇文章简单讨论如何利用RMAN工具中的backup as copy.copy.convert命令在ASM和文件系统之间拷贝数据. 一.从ASM拷贝数据到文件系统. 1).拷贝数据文件: RMAN> backup as copy datafile '+data01/orcl/datafile/USERS.263.829729669' format '/u01/app/oracle/bak/user01.dbf'; Starting backup at 2013-10-28 02:

SQL Server与Oracle数据库在查询优化上的差异(一)

一般来说,Oracle数据库在大型数据环境下,其运行性能比SQL Server数据库效率要高.单从查询优化上讲,两者就有比较大的差异.下面,笔者将数据库查询优化的差异做一个描述,若有不准确的地方,还请大家批评指教. 一. 在数据库排序查询优化上的差异. 在讲解这个内容之前,为了读者能够清楚我讲的内容,我要先谈一个概念.命中率,它是指从内存中取得数据而不从磁盘中取得数据的比率.我们在前几篇文章中都提到过,当在数据库中查询数据时,数据库服务器都是先从内存中寻找数据.只有在内存中数据不存在的情况下,才

java oracle 连接-帮忙看看为什么数据库是连上了还是有

问题描述 帮忙看看为什么数据库是连上了还是有 sql exception:java.lang.NullPointerException package function; //JDBC中的所有类和接口都在java.sql包下. import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql

sql server-新手提问:数据库连不上

问题描述 新手提问:数据库连不上 出现错误: 通过端口 1433 连接到主机 119.164.252.213 的 TCP/IP 连接失败.错误:"connect timed out.请验证连接属性.确保 SQL Server 的实例正在主机上运行,且在此端口接受 TCP/IP 连接,还要确保防火墙没有阻止到此端口的 TCP 连接.".... 解决方案 119.164.252.213 是公网ip吧?检查硬件防火墙和软件防火墙,有阻止了 解决方案二: 在本机119.164.252.213企

Oracle数据库使用存储过程上传大图片 blob参数 ,上传失败怎么会事?

问题描述 Oracle数据库使用存储过程上传大图片 blob参数 ,上传失败怎么会事? procedure proc1( Attachmen in out blob, --附件 ) is i integer; atta blob; begin dbms_lob.createtemporary(atta,true); select we.nextval into i from dual; insert into t_TrafficInfor (id,Attachment) values(i,EMP

spring-求大神!!在Spring3.2和Hibernate4.2.8集成测试的时候出现数据库连不上的错误。。。

问题描述 求大神!!在Spring3.2和Hibernate4.2.8集成测试的时候出现数据库连不上的错误... org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Could no

sql登陆不上-数据库登陆不上,不知道怎么回事

问题描述 数据库登陆不上,不知道怎么回事 登陆SQLServer 2008的时候,无论是SQL Server身份验证登陆还windows身份登陆,都会弹出来一个 已成功与服务器连接,但是登陆过程中发生错误(provide:TCP提供程序,error:0-远程主机强迫关闭一个现有的连接) 解决方案 你是不是已经登录账号了!重新启动下机器在试试吧

初学者,关于C#写的程序如何在没安装数据库的电脑上存东西

问题描述 想用C#写一个统计的小软件.给朋友用,但我现在学的是C#应用和sql数据库结合着用,存东西.在没有安装数据库的电脑上如何实现应用程序存储数据?谢谢各位前辈赐教.小弟初学编程 解决方案 解决方案二:序列化...解决方案三:#region序列化XMLXmlSerializerx=newXmlSerializer(typeof(Person));Personp=newPerson(){Name="小王",Age=19,Sex='男'};using(FileStreamf=newFi