Oracle中filesystemio_options and disk_asynch_io两个参数的思考

简介: 文献参考: Things To Consider For Setting filesystemio_options And disk_asynch_io (文档 ID 1987437.1) 场景描述:某个数据库大量使用了OS的cache,为了很好地理解I/O,通过分析上述MOS的文章,写一些自己的理解。
文献参考:  Things To Consider For Setting filesystemio_options And disk_asynch_io (文档 ID 1987437.1)
场景描述:某个数据库大量使用了OS的cache,为了很好地理解I/O,通过分析上述MOS的文章,写一些自己的理解。

定调: filesystemio_options参数和 disk_asynch_io参数,是直接控制Oracle数据库如何执行I/O请求,其中有 asynchronous I/O和 direct I/O选项,会直接影响数据库的性能。

Synchronous I/O vs Asynchronous I/O(同步IO vs 异步IO)


       在同步I/O的机制下,一个Oracle进程调用一个I/O请求必须等待到其他请求完成其所有操作之后才能调用。例如,如果它发起对几个数据块的读取,那么进程就必须等待,等待它把所有数据块都读取到内存之后,才能做其他事情。
       在异步I/O的机制下,进程可以与I/O请求同时工作,在每一个数据块到来之后,直接对每一个数据块进行处理,不用等待所有数据块全部加载完毕,再处理。

Buffered I/O vs Direct I/O

   
       在buffered I/O机制下,操作系统维护自己的一套cache用于磁盘数据,而不是直接从process buffer读取或者写入。从磁盘中读取数据写入cache中,然后拷贝至process buffer。亦或者从process buffer中拷贝至cache然后写入到磁盘中。

img_e667eaaf9179dda0b7448f7c3d246db6.png

   如此,操作系统会维护自己的cache保证可以校验对齐匹配disk sector(磁盘扇区,一般是 512, 1024, 2048, 4096, or 8192 bytes(字节) )。这样,可以让进程读取和写入任意尺寸和未对齐的数据时,通过拷贝process buffer的过程中,直接校验对齐。这样,它在响应读请求的时候无需从磁盘读取数据,而是先把数据预读取至cache中,直接从cache中读取数据。加速数据的读取能力。

Note:大多数文件系统都是这样实现buffered I/O.

   但是,Oracle已经有自己的buffer和cache。发起读取和写入请求的时候,都会去对齐数据块,同时会执行自己的预读取。有Oracle的情况下使用buffered I/O会在OS buffer cache和Oracle buffer cache之间产生冗余cache。浪费CPU的额外时间。Direct I/O 能让所有的读和写的请求直接都来自于硬盘,避免double-buffering的开销。

   为了防止RAC的数据损坏,必须直接使用Direct I/O。

警告:启用direct I/O会直接绕过操作系统的buffer cache,但不能改变Oracle buffer cache的大小。任何来自于Oracle发起的读请求都可以从操作系统的buffer cache中得到满足,这将导致硬盘读取的时间过长。为了充分利用direct I/O的效能,必须将原来分配给OS的buffer cache替换给Oracle的SGA和Oracle的buffer cache。

例子:考虑到一个数据库,Oracle是这个操作系统的唯一用户,因此,使用buffer I/O的唯一用户也是Oracle。且目前服务器的内存配置是256GB,如果配置一个16GB的SGA和使用最大至8GB的PGA,那么剩余的232GB大部分将由操作系统使用,用于缓存Oracle的数据------这里有一个小小的引申,配到类似性能下降的问题--------,和其他一些杂项的操作。这意味着尽管Oracle的缓存少于16GB,但是有效的buffer cache早就已经超过200GB了,如果启用了Direct I/O,而SGA和buffer cahce没有增长至有效的大小,那么Oracle的性能就会在读取大量块的时候,产生性能的下降。假设如果16GB对于操作系统来说已经足够的话,那么用于集群软件,ASM,等等,我们定一个安全边际,可以设置SGA增长至216GB(16GB给予OS,8GB给予PGA)


Direct I/O vs Concurrent I/O


POSIX( Portable Operating System Interface of UNIX )要求,单独的读和写的调用要以原子性完成,意味着一个读操作不会看到部分写入地数据和双重叠写入而导致数据交错。为了防止其他读写操作的时候同时有写入操作,文件系统继承了锁机制,大多数情况下,整个文件有一个锁操作,这意味着严重影响并发性。在direct I/O下禁用锁机制叫做concurrent I/O。

Oracle已经在读和写上面有了自己的锁机制,因此,不需要这种保护,如果开启 concurrent I/O,效果会最好。如果 concurrent I/O不支持或者不启用,当DBWR同时写同一个文件,对于性能来说是不能忍受的。

在许多操作系统和文件系统的组合中,启用了 direct I/O, concurrent I/O会被 隐式启用。对于其他的,例如AIX或者 VxFS,它必须显示开启

建议:

Asynchronous I/O, direct I/O和 concurrent I/O都是建议使用的,他们能产生一个 乘法效应,当 Asynchronous I/O启用时, direct I/O 可以更好地工作。 不要将常规文件(包括二进制文件、日志文件和任何Oracle Home文件)放在一个挂载在开启了 concurrent I/O的文件系统上面。

控制Asynchronous I/O and Direct I/O的参数


影响 asynchronous I/O和 Direct I/O的参数是: filesystemio_options和 disk_asynch_i o,还有系统的平台,文件系统的格式。

Synchronous I/O

Asynchronous I/O
Buffered I/O none asynch
Direct I/O directIO setall

FILESYSTEMIO_OPTIONS的参数:
"asynch":允许asynchronous IO在OS层面上。
"directIO":允许directIO
"setall":开启ASYNC和DIRECT IO,
"none";Oracle使用synchronous writes,不做任何的direct io的选项。

disk_asynch_io

disk_asynch_io   参数默认是true,是 asynchronous I/O的主开关。关闭,就只能走 synchronous机制,无视 filesystemio_options参数的设定。

filesystemio_options
平台 filesystemio_options的默认配置 Notes
Linux none Oracle only supports native Linux asynchronous I/O, which requires also using direct I/O.  So disabling direct I/O also disables asynchronous I/O: filesystemio_options=asynch will not enable asynchronous I/O.  Note that older Linux kernels do not support native asynchronous I/O.

File System–specific Notes

ASM文件系统 对于ASM,Oracle会直接跳过文件系统层面,filesystemio_options 参数是无作用的 ,direct I/O总是被使用
结论:
在ASM文件系统管理中,I/O是异步的,而且直接做的是direct I/O。所以,对于ASM文件系统,不用设置filesystemio_options。
只需设置上述的SGA和PGA即可。
前提:服务器为256G内存, 假设如果16GB对于操作系统来说已经足够的话,那么用于集群软件,ASM,等等,我们定一个安全边际,可以设置SGA增长至216GB(16GB给予OS,8GB给予PGA)

--------------------------------bug参考-----------------------
bug文献参考:ORA-1578 ORA-353 ORA-19599 Corrupt blocks with zeros when filesystemio_options=SETALL on ext4 file system using Linux (文档 ID 1487957.1)

对于ext4 文件系统,运用在linux操作系统平台上面,设置filesystemio_options=SETALL,会触发以上bug:ORA-1578 ORA-353 ORA-19599。还需谨慎使用。

解决思路:
- 对于RHEL5操作系统
kernel-2.6.18-238.el5 - RHEL5.6 Errata RHSA-2011-0017 or later
( [fs] ext4: move aio completion after unwritten extent con (Eric Sandeen) [617690] )
- 对于RHEL6操作系统
kernel-2.6.32-71 and later 
( [fs] ext4: move aio completion after unwritten extent conversion (Christoph Hellwig) [589985] )


相关文章
|
6月前
|
缓存 关系型数据库 MySQL
MySQL Binlog--事务日志和BINLOG落盘参数对磁盘IO的影响
MySQL Binlog--事务日志和BINLOG落盘参数对磁盘IO的影响
125 0
|
6月前
|
Rust
【一起学Rust · 项目实战】命令行IO项目minigrep——接收命令行参数与读取文件内容
【一起学Rust · 项目实战】命令行IO项目minigrep——接收命令行参数与读取文件内容
95 0
【一起学Rust · 项目实战】命令行IO项目minigrep——接收命令行参数与读取文件内容
|
6天前
|
存储 弹性计算 固态存储
阿里云服务器ESSD Entry系统盘测评IOPS、IO读写和时延性能参数
ESSD Entry云盘是阿里云推出的新一代云盘,具备高IOPS、低延迟和企业级数据保护能力。适用于开发与测试场景,支持按量付费和包年包月计费模式。99元和199元的ECS经济型e实例和通用算力型u1实例均采用ESSD Entry系统盘,性价比高。详细性能参数和价格请参考阿里云官方页面。
35 0
|
6月前
|
存储 监控 关系型数据库
MySQL 参数innodb_read_io_threads
`innodb_read_io_threads` 是 MySQL 数据库中 InnoDB 存储引擎的一个配置参数,它用于指定后台线程池中用于处理读取 I/O 请求的线程数量。InnoDB 存储引擎负责管理数据库的物理存储和检索,是 MySQL 最常用的存储引擎之一。 ### 参数说明 - **名称**: `innodb_read_io_threads` - **默认值**: 4 - **范围**: 1 到 64 - **动态修改**: 不能动态修改(需要重启服务器) - **适用版本**: MySQL 5.6 及以上版本 ### 作用 `innodb_read_io_threads`
571 1
|
4月前
|
Linux 开发工具
CPU-IO-网络-内核参数的调优
CPU-IO-网络-内核参数的调优
72 7
|
6月前
|
Oracle 关系型数据库 Java
Oracle 19c 查看隐含参数视图
Oracle 19c 查看隐含参数视图
98 7
|
6月前
|
人工智能 数据挖掘 Python
Python pandas中read_csv函数的io参数
Python pandas中read_csv函数的io参数
69 5
|
6月前
|
SQL 监控 Oracle
Oracle 性能优化之AWR、ASH和ADDM(含报告生成和参数解读)
Oracle 性能优化之AWR、ASH和ADDM(含报告生成和参数解读)
|
6月前
|
运维 Oracle 关系型数据库
Oracle服务器参数文件:数据王国的“调控大师”
【4月更文挑战第19天】Oracle服务器参数文件,数据库的“调控大师”,掌控着内存管理、进程调度等关键设置。通过参数调整如SGA_MAX_SIZE和PROCESSES,实现性能优化和故障防控。虽然挑战重重,但成功的性能调优带来无尽成就感。它在备份恢复中也扮演重要角色,保障数据一致性与可用性。成为真正的“调控大师”,为数据王国效力!
|
6月前
|
存储 SQL Oracle
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
107 7