文献参考:
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然后写入到磁盘中。
如此,操作系统会维护自己的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, concurrent I/O会被 隐式启用。对于其他的,例如AIX或者 VxFS,它必须显示开启
![26446098_1512553064PFz1.png](http://blog.itpub.net/attachment/201712/6/26446098_1512553064PFz1.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
平台 | 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)
前提:服务器为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] )