一 前言
filesystemio_options 控制着操作系统io的设置。该参数只作用于文件系统。它有四个值可供设置,分别是:{none | setall | directIO | asynch }。该参数默认值受数据库版本和操作系统类型及操作系统版本影响。
从oracle 10G开始,对于ASM磁盘管理的情况,filesystem_option参数不作用于ASM磁盘管理的数据库。
二 I/O 说明
说明
在Synchronous I/O 的机制下,若一个Oracle进程想调用一个I/O请求,那么必须等待其他请求完成后才能调用。例如,如果它发起对几个数据块的读取,那么进程就必须等待它把所有数据块都读取到内存之后,才能进行下一个动作。
说明
在Asynchronous I/O 的机制下,进程可以与I/O请求同时工作。对已经读取的数据块,可以直接进行处理,不用等待所有数据块全部加载完毕再处理。
说明
在buffer I/O机制下,操作系统有自己的一套用于维护磁盘数据的cache,而不是直接从process buffer读取或者写入。其原理是从磁盘中读取数据写入cache,然后拷贝至process buffer。或者从process buffer中拷贝至cache然后写入到磁盘中。
2.4 direct I/O 说明
Direct I/O 能让所有的读和写的请求直接来自于磁盘,绕过操作系统缓存。
在ASM磁盘管理下,为了防止集群管理的数据库的数据损坏,必须直接使用Direct I/O。
对于使用文件系统的数据库环境,Oracle发出的读取请求可以从OS缓冲区中得到满足,而一旦启用direct I/O又不增加SGA大小,将导致磁盘读取需要更多的时间才能完成。为了充分利用direct I/O,需要将用于OS缓存部分增加到数据库SGA中。
三 filesystemio_options 和liao 参数说明
disk_asynch_io 是相当于主开关,不管是文件系统还是裸设备,它都控制着异步io的开启与关闭,filesystemio_options是子开关,控制着文件系统上的异步io。如果数据库使用了文件系统, 那么I/O只受filesystemio_options控制。
的情况
RAC 环境下,direct I/O是默认开启的。并且在ASM磁盘管理下,I/O肯定是异步的,而且直接做的是direct I/O。所以,对于ASM磁盘管理,不用设置filesystemio_options,只要设置合理的SGA和PGA大小即可。(详情见mos:Document 751463.1)
单机的情况
在文件系统文件管理的情况下,那么异步I/O的开启则受filesystemio_options的控制影响。
以下是Oracle官方文件系统管理的情况下,使用同/异步IO,缓存/直接IO的设置矩阵说明。
文件系统设为开启异步和直接IO那么就选setall选项,开启同步和直接IO就选directIO选项。
四 参数配置说明
1 、单机环境下,异步IO受filesystemio_options控制,此参数用于特定的平台,各个操作系统平台默认值不一样,linux平台默认是none,更改选项语句格式:
ALTER SYSTEM SET FILESYSTEMIO_OPTIONS={SETALL|ASYNCH| DIRECTIO|NONE}SCOPE=SPFILE;

2 、RAC环境下,Asynchronous IO受DISK_ASYNCH_IO参数控制,默认是TRUE,更改选项语句格式:
ALTER SYSTEM SET DISK_ASYNCH_IO={FALSE|TRUE} SCOPE=SPFILE;
Oracle 建议您将此参数设置为其默认值。但是,如果asynchronous I/O 性能不稳定,则可以将此参数设置为false,以禁用asynchronous I/O 。如果您的平台不支持磁盘asynchronous I/O ,则此参数不起作用。
五 参数配置建议
在linux下FILESYSTEMIO_OPTIONS参数配置建议:
filesystem_option 参数,只有在9i,10G的时代,AIX、HP小机,使用祼设备的情况下设置filesystem_option为异步+直接I/O,电信也是基于这样的环境下设置该参数,10G开始,有了ASM,filesystem_option可以由Oracle自动配置,特别是11G及以上都是默认none,而对于文件系统,不建设设置为异步+直接I/O。
setall : 存储I/O性能良好的情况下设置,可以大幅提升I/O总体性能,尤其是写性能,如果多套数据库公用一套存储则不建议设置此参数。使用场景除了小机和裸设备,文件系统如果要开启的话,需要具备两点:1、把文件系统的cache内存加到SGA上去,变向的保证缓存量,2、修改前操作系统磁盘性能指标正常不存在瓶颈。磁盘监控的主要iostat指标如下:
使用率(%util ) :是指磁盘 I/O 的百分比。过高的使用率(比如达到 80% 及以上),通常意味着磁盘 I/O 存在性能瓶颈。
队列长度(aqu-sz ): 平均请求队列长度
IOPS (r/s+ w/s ): 是指每秒的 I/O 请求数。
吞吐量(rkB/s+wkB/s ) :是指每秒的 I/O 请求大小。
响应时间(r_await+w_await ) :是指 I/O 请求从发出到收到响应的间隔时间。
* 对于 aqu-sz ,r/s+ w/s ,rkB/s+wkB/s ,r_await+w_await 的几个指标,基线是每个环境都不一样的,如果要定基线找几个环境开始监控这些指标,作为正常时间段的基线。
注意:除了操作系统层面指标出现大幅异常,我们同样需要注意数据库层面的等待事件(db file sequential/scattered read,direct path read/write等),特别需要注意开启前后与I/O相关的等待响应时间是否发生大幅变化。
directIO : 直接绕过缓存,使用directIO参数意味着Synchronous I/O 需要等待其他请求完成后才能调用,对存储压力较大。且消耗CPU资源,不建议在生产上设置此参数。
asynch : 异步IO可以提高性能,但是显而易见的是对磁盘处理IO能力有较高要求,否则提交的处理请求多,处理能力跟不上,根本无法达到提高性能的要求。(开启前请先检查磁盘IO处理能力,若磁盘性能已在临界值,开启后总体性能反而会有明显下降)
None : 默认参数,由Oracle自身调节,有较好的综合表现。
六 实验测试
测试结果:相同的测试环境下,none的整体性能优于其他三种。(由于采用的是虚拟化环境测试经过仅供参考)。具体测试结果如下:
测试工具:HammerDB
测试环境:centos7.4 + oracle11.2.0.4单机 虚拟化环境8核cpu、12GB内存
数据库内存配置:SGA 2.4G PGA 798M
模型样本数据量:200g数据,5仓库,测试用户20
对照指标:TMP,为每分钟处理事务数。每分钟处理值越高代表数据库总体处理性能越好。
总结:在存储性能一般的情况下设置setall和Asynch数据库总体性能都会下降。
设置Setall TMP值:

设置directIO TMP值:

设置Asynch TMP值:

设置None TMP值:

实验数据对照表
|
setall |
directIO |
Asynch |
None |
量化指标 | |
|
Cpu 用户使用峰值 |
78% |
50% |
38% |
36% |
Utilization :Idle |
|
Cpu 平均功耗排名 |
4 |
3 |
1 |
2 |
值越小代表平均功耗越高 |
|
内存(空闲内存) |
5.3G ~4.3G |
5G ~3.8G |
4.8G ~1.2G |
6G ~0.1G |
Memory (K Bytes) |
|
内存使用排名 |
4 |
2 |
3 |
1 |
值越小代表平均使用率越高 |
|
I/O 繁忙度 |
50% ~100% |
72% ~100% |
25% ~100% |
80% ~100% |
Iostat:vdc percent busy |
|
I/O 读/写峰值(kb/s) |
1100/5500 |
300/6200 |
220/4800 |
1200/5300 |
Iostat: vdc Writes/Reads Per Second |

图1-1Cpu用户使用率监控图

图1-2内存监控图
图1-3 IO读写监控图
从图1-1 Cpu用户使用率监控图得出结论,设置成setall时,cpu平均使用率是最低的,那么说明此参数cpu消耗较小。ASYNCH消耗cpu最高,NONE第二,其次DIRECTIO。
从图1-2 分析,在压力测试期间内存占用最高的是NONE,第二是ASYNC,第三是DIRECTIO,最后是SETALL。
从图1-3 IO读写监控图分析得到结论,设置成setall时,每秒读平均流量明显高于参数设置成none和async时,由于实验环境I/O性能存在一定的瓶颈,I/0 繁忙度很容易达到100%。在生产发生问题时,同样表现为I/O读流量较高。如下图所示:


六 总结
根据以上实验数据得出结论,FILESYSTEMIO_OPTIONS参数设置成SETALL后操作系统CPU和内存占用情况没有出现很大的异常,在I/O读方面有较大的变化。设置成SETALL慢是因为数据库出现了严重的I/O等待,导致数据库整体变慢。导致变慢的原因主要有两个:1、内存使用量少,说明cache到内存的数据少了,大部分压力直接落在了磁盘I/O上,这时候应适当调整SGA大小(原本Oracle发出的读取请求可以从OS缓冲区中得到满足,而一旦启用setall意味着开启了direct I/O,这时候应该增加数据库SGA大小,否则将导致磁盘读取需要更多的时间才能完成);2、存储I/O瓶颈,无法提供更高的I/O吞吐量,大量的阻塞会话来不及处理,导致数据库系统整体变慢。所以一定要在存储性能良好的情况下设置SETALL参数。
下图是生产故障时awr报告的等待事件部分,总体I/O等待占据了整个DB time的68.1%,且平均I/0 等待达到了3ms,正常情况下,平均I/0等待在应在1ms以下。直接路径读等待事件的平均I/O延迟更是达到了7ms,占据了整个DBtime的19.9%。显然当时数据库总体性能已经出现了严重的问题,由于相关I/O等待事件的大量堵塞,导致数据库响应速度整体变慢。

图1-4 故障时间I/O等待

图1-4 正常运行时I/O等待
七 论证调整调大SGA 后性能变化
测试工具:HammerDB
测试环境:centos7.4 + oracle11.2.0.4单机 虚拟化环境8核cpu、12GB内存
数据库内存配置:SGA 4.8G PGA 798M
模型样本数据量:200g数据,5仓库,测试用户20
参数设置filesystem_option设置为SETALL
SGA 设置4.8G TMP值:

SGA 设置2.4G TMP值:

SGA 设置4.8G 每秒读写值:

SGA 设置2.4G 每秒读写值:

根据以上实验数据得出结论,FILESYSTEMIO_OPTIONS参数设置成SETALL情况下,调大数据库SGA,数据库总体性能有所改善,且磁盘每秒读平均在200k/s以下。总体TPM有所提升,且每秒读压力有所降低。
