Andy Kerber (@dbakerber), Senior Consultant
In this blog I will examine the effects ‘setall’ and ‘none’ on the Oracle initialization parameter filesystemio_options. This setting is used to set I/O parameters for the Oracle database when the data files are stored on file system rather than ASM.
Test Environment
The Oracle database version is 12.1.0.2, and the OS version is RHEL 7.6. The VMware Workstation and Oracle VirtualBox versions are the most recent available – VirtualBox version 5.2.12r122591 and VMware Workstation Pro version 12.5.7 build-5813279. The NMON analyzer version is 5.21 and SLOB version is 2.4.0.
Explanation of filesystemio_options
I/O operations in UNIX and Linux systems typically go through the file system cache. Although this doesn’t represent a problem in itself, this extra processing does require resources. Bypassing the file system cache reduces CPU requirements, and frees up the file system cache for other non-database related file operations. Operations against raw devices automatically bypass the file system cache.
When a synchronous I/O request is submitted to the operating system, the writing process blocks until the write is complete before continuing to process. With asynchronous I/O, processing continues while the I/O request is submitted and processed. This allows asynchronous I/O to bypass some of the performance bottlenecks associated with I/O operations.
Oracle can take advantage of direct I/O and asynchronous I/O on supported platforms using the FILESYSTEMIO_OPTIONS parameter, the possible values for which are listed below.
- ASYNCH – enables asynchronous I/O where possible
- DIRECTIO – enables direct I/O where possible
- SETALL – enables both direct I/O and asynchronous I/O where possible
- NONE – disables both direct I/O and asynchronous I/O
Configuration
Both VMs were created as new VMs, and each VMDK was pre-allocated to full size. The VM (on both VirtualBox and VMware Workstation) were created with 16G RAM and 1 CPU. Swap size was set to 16G also. A second VMDK was added for the Oracle datafiles, size 80G (once again, pre-allocated). This was mounted on /u02. In each, an Oracle database was created SID iotest, and disk_asynch_io=TRUE.
The SLOB tablespace was created with the tablespace name slob, and pre-allocated to 32G in size in order to eliminate waits on file extension. We created 64 slob schemas, and tested with 32 schemas using this command: ./runit.sh 32
Testing Process
In the testing process, filesystemio_options was set to setall in the spfile, the system rebooted and the database started. Each time the filesystemio_options setting was changed, the system was rebooted in order to make sure there was no caching interfering with the process. Each test ran for one hour. It was expected that the filesystemio_options=setall would produce measurably, though not substantially better, I/O performance than filesystemio_options=none.
Results
However, the results of the test were surprising, and consistent on both VirtualBox and VMware Workstation.
Below is a typical graph from NMON analyzer with filesystemIO_options=SETALL:
In the AWR reports we see this for the top foreground wait events:
Top 10 Foreground Events by Total Wait Time ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Total Wait Wait % DB Wait Event Waits Time (sec) Avg(ms) time Class ------------------------------ ------- ---------- -------- ----- -------- db file sequential read 55,702 11.1K 199.49 74.1 User I/O db file parallel read 7,101 3890.4 547.86 25.9 User I/O DB CPU 17.9 .1 cursor: pin S wait on X 53 2.9 55.09 .0 Concurre library cache load lock 93 2.3 24.25 .0 Concurre db file scattered read 47 2 41.62 .0 User I/O read by other session 107 1.6 15.19 .0 User I/O log file sync 27 1.5 55.75 .0 Commit Disk file operations I/O 63 1.3 21.14 .0 User I/O control file sequential read 123 1.1 9.20 .0 System I Wait Classes by Total Wait Time ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Avg Avg Total Wait Wait % DB Active Wait Class Waits Time (sec) (ms) time Sessions -------------- ---------- ------------ ------- ------ -------- User I/O 71,514 15,558 217.55 103.7 8.3 System I/O 14,235 1,071 75.23 7.1 0.6 DB CPU .1 0.0 Concurrency 203 6 29.23 .0 0.0 Commit 38 2 49.41 .0 0.0 Other 526 2 3.04 .0 0.0 Network 80 0 0.00 .0 0.0
Below is typical output when filesystemIO_options=NONE.
Top 10 Foreground Events by Total Wait Time ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Total Wait Event Waits Time Wait % DB Wait (sec) Avg(ms) time Class ------------------------------ ---------- ------- -------- ----- -------- free buffer waits 2,528,630 26.2K 10.35 90.0 Configur db file parallel read 226,393 1569 6.93 5.4 User I/O db file sequential read 1,603,321 320.2 0.20 1.1 User I/O buffer exterminate 19,919 200.4 10.06 .7 Other DB CPU 138 .5 write complete waits 47 136.9 2912.46 .5 Configur latch: cache buffers chains 16,208 135 8.33 .5 Concurre latch: cache buffers lru chain 26,913 116.8 4.34 .4 Other db file scattered read 1,513 49 32.39 .2 User I/O log buffer space 99 23.5 237.62 .1 Configur Wait Classes by Total Wait Time ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Avg Avg Total Wait Wait % DB Active Wait Class Waits Time (sec) (ms) time Sessions -------------- ------------ ---------------- ---------- ------ -------- Configuration 2,792,212 29,067 10.41 100.0 8.1 System I/O 23,147 3,611 155.99 12.4 1.0 User I/O 1,867,661 1,953 1.05 6.7 0.5 Other 53,904 396 7.34 1.4 0.1 Concurrency 18,577 229 12.32 .8 0.1 DB CPU 138 .5 0.0 Commit 50 1 13.11 .0 0.0 Network 72 0 0.00 .0 0.0
As you can see, it appears that filesystemIO_options=SETALL is being choked by the CPU resource, while filesystemIO_options=NONE has plenty of CPU available. Most likely the choke point is simply the I/O bandwidth.
At one of our recent clients, setting the filesystemio_options=setall in an Oracle database running in vSphere virtualization on enterprise level storage caused a roughly 30 percent improvement in the I/O performance of the database.
Conclusions
What are the implications of this? Most obviously, the filesystemIO_options setting on a VM probably needs to be evaluated on an individual basis when using filesystem. Additionally, it may imply that the ASM is the better choice in a virtualized environment. While the results of this experiment have been interesting, I plan to follow up with more research in more powerful environments in the future in order to determine how much the underlying hardware affects the recommendations for this setting.