文献参考:
Things To Consider For Setting filesystemio_options And disk_asynch_io (文档 ID 1987437.1)
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请求必须等待到其他请求完成其所有操作之后才能调用。
例如,如果它发起对几个数据块的读取,那么进程就必须等待,等待它把所有数据块都读取到内存之后,才能做其他事情。
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。
假设如果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 |
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总是被使用 |
前提:服务器为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] )