FILESYSTEMIO_OPTIONS - Configure Oracle Direct & Async I/O
FILESYSTEMIO_OPTIONS
Section titled “FILESYSTEMIO_OPTIONS”Overview
Section titled “Overview”FILESYSTEMIO_OPTIONS controls how Oracle interacts with the operating system’s file system cache when performing I/O against file-system-based datafiles, control files, and log files. By configuring direct I/O (DIRECTIO), asynchronous I/O (ASYNCH), or both (SETALL), you can bypass the OS file system buffer cache and allow Oracle to manage its own buffer cache exclusively. This avoids double-buffering — where data is cached both in the Oracle buffer cache and the OS page cache — which wastes memory and can degrade performance on large, I/O-intensive workloads.
On Linux and AIX systems, FILESYSTEMIO_OPTIONS=SETALL is the most common production recommendation when datafiles reside on file systems rather than ASM. It combines direct I/O (eliminating OS buffer cache involvement for Oracle data) with asynchronous I/O (allowing Oracle processes to submit I/O requests without blocking).
Parameter Type: Static (requires instance restart to change) Default Value: Platform-dependent (typically NONE on most platforms) Valid Values: NONE, ASYNCH, DIRECTIO, SETALL Available Since: Oracle 9i Modifiable: No — SCOPE=SPFILE only; takes effect on next startup PDB Modifiable: No (CDB-level setting)
Configuration
Section titled “Configuration”Viewing Current Value
Section titled “Viewing Current Value”-- Check current FILESYSTEMIO_OPTIONS settingSELECT name, value, isdefault, ismodified, descriptionFROM v$parameterWHERE name = 'filesystemio_options';
-- Check SPFILE valueSELECT name, value, isspecifiedFROM v$spparameterWHERE name = 'filesystemio_options';
-- Review all I/O-related parameters togetherSELECT name, value, isdefaultFROM v$parameterWHERE name IN ( 'filesystemio_options', 'disk_asynch_io', 'db_file_multiblock_read_count', 'db_writer_processes')ORDER BY name;Setting the Parameter
Section titled “Setting the Parameter”-- Enable both direct I/O and async I/O (recommended for Linux/AIX with filesystem storage)ALTER SYSTEM SET filesystemio_options = SETALL SCOPE=SPFILE;
-- Enable async I/O only (preserves OS buffer cache, adds async behavior)ALTER SYSTEM SET filesystemio_options = ASYNCH SCOPE=SPFILE;
-- Enable direct I/O only (bypasses OS cache, synchronous I/O)ALTER SYSTEM SET filesystemio_options = DIRECTIO SCOPE=SPFILE;
-- Disable (use OS default buffered I/O)ALTER SYSTEM SET filesystemio_options = NONE SCOPE=SPFILE;
-- After any change, restart the instance to apply-- SHUTDOWN IMMEDIATE;-- STARTUP;
-- Verify after restartSELECT name, valueFROM v$parameterWHERE name = 'filesystemio_options';Tuning Guidance
Section titled “Tuning Guidance”Recommended Values
Section titled “Recommended Values”| Platform / Storage | Recommended Value |
|---|---|
| Linux + ext4/XFS + file system datafiles | SETALL |
| Linux + NFS (with async mount option) | SETALL |
| AIX + JFS2 | SETALL |
| Solaris + UFS | SETALL |
| Windows NTFS | NONE (Windows handles async differently) |
| Oracle ASM disk groups | Not applicable — ASM bypasses file system |
| Exadata Smart Storage | SETALL (set by Oracle by default) |
| Systems with limited RAM (OS cache valuable) | ASYNCH |
For most Linux and AIX production environments with file-system-resident datafiles, SETALL is the correct choice. It eliminates double-buffering and enables asynchronous I/O, both of which improve throughput and reduce latency for write-heavy workloads.
How to Size
Section titled “How to Size”This parameter has no numeric sizing — the tuning decision is selecting the right mode for your platform and storage configuration.
-- Measure double-buffering impact: compare Oracle buffer cache hit ratio-- before and after setting DIRECTIOSELECT name, valueFROM v$sysstatWHERE name IN ( 'physical reads cache', 'physical reads direct', 'physical reads', 'db block gets from cache', 'consistent gets from cache')ORDER BY name;
-- Quantify async I/O usageSELECT event, total_waits, time_waited, ROUND(time_waited / NULLIF(total_waits, 0), 2) AS avg_wait_centisecsFROM v$system_eventWHERE event IN ( 'db file async I/O submit', 'db file sequential read', 'db file scattered read', 'log file parallel write')ORDER BY time_waited DESC;
-- Review physical I/O metrics to baseline before changingSELECT metric_name, average, maximumFROM v$sysmetric_summaryWHERE metric_name IN ( 'Physical Read Total IO Requests Per Sec', 'Physical Write Total IO Requests Per Sec', 'Physical Read Total Bytes Per Sec', 'Physical Write Total Bytes Per Sec')ORDER BY metric_name;Monitoring
Section titled “Monitoring”-- Monitor direct reads vs cached reads ratioSELECT ROUND(direct.value / NULLIF(total.value, 0) * 100, 2) AS direct_read_pctFROM v$sysstat direct, v$sysstat totalWHERE direct.name = 'physical reads direct' AND total.name = 'physical reads';
-- Check I/O throughput by file after changing to SETALLSELECT f.name, s.phyrds, s.phywrts, s.readtim, s.writetimFROM v$datafile fJOIN v$filestat s ON f.file# = s.file#WHERE s.phyrds + s.phywrts > 0ORDER BY s.readtim + s.writetim DESC;
-- Monitor OS page cache usage reduction (Linux: check /proc/meminfo Cached)-- Oracle cannot directly query OS memory; use OS-level monitoring alongsideSELECT name, valueFROM v$sysstatWHERE name LIKE '%physical read%'ORDER BY name;Common Issues
Section titled “Common Issues”Issue 1: SETALL Causes I/O Errors on NFS Without Async Mount Option
Section titled “Issue 1: SETALL Causes I/O Errors on NFS Without Async Mount Option”If datafiles reside on NFS mounts that do not have the async option set at the OS level, enabling SETALL or ASYNCH may result in I/O errors or poor performance because the NFS client does not support async writes.
Resolution: Either configure the NFS mount with the async option (verify with your storage team), or use DIRECTIO only. Alternatively, switch to Oracle Direct NFS (dNFS), which manages its own async I/O independently of mount options.
-- Check for I/O errors in alert log or verify with:SELECT name, valueFROM v$parameterWHERE name = 'filesystemio_options';-- Then review OS-level NFS mount options: mount | grep nfsIssue 2: Direct I/O Bypasses OS Cache and Degrades Small-File Performance
Section titled “Issue 2: Direct I/O Bypasses OS Cache and Degrades Small-File Performance”For small databases or systems where the OS file cache was providing significant read caching (visible as high OS cache hit ratios), switching to DIRECTIO or SETALL may initially increase physical reads as Oracle’s buffer cache takes over the caching role.
Resolution: Ensure DB_CACHE_SIZE or SGA_TARGET is sized appropriately to absorb the caching workload that was previously handled by the OS. Monitor buffer cache hit ratios after the change.
-- Check buffer cache hit ratio after enabling direct I/OSELECT ROUND((1 - (phys.value / (db_gets.value + cons_gets.value))) * 100, 2) AS buffer_cache_hit_pctFROM v$sysstat phys, v$sysstat db_gets, v$sysstat cons_getsWHERE phys.name = 'physical reads cache' AND db_gets.name = 'db block gets from cache' AND cons_gets.name = 'consistent gets from cache';Issue 3: Parameter Has No Effect on ASM-Resident Datafiles
Section titled “Issue 3: Parameter Has No Effect on ASM-Resident Datafiles”Setting FILESYSTEMIO_OPTIONS when all datafiles reside in ASM disk groups has no effect because ASM uses its own I/O path that bypasses the OS file system entirely.
Resolution: This is expected behavior. No action is needed. For ASM environments, focus on DB_WRITER_PROCESSES and ASM disk group configuration instead.
-- Verify storage type of datafilesSELECT file#, name, statusFROM v$datafileORDER BY file#;-- If paths begin with '+', they are ASM and unaffected by this parameterRelated Parameters
Section titled “Related Parameters”- DISK_ASYNCH_IO — High-level async I/O toggle; works in conjunction with FILESYSTEMIO_OPTIONS
- DB_FILE_MULTIBLOCK_READ_COUNT — Controls read I/O size; direct I/O maximizes benefit from larger multiblock reads
- DB_WRITER_PROCESSES — Controls write parallelism; async I/O amplifies the benefit of multiple DBWn processes
- SGA_TARGET — When using direct I/O, the Oracle buffer cache must be properly sized to replace OS caching
Related Errors
Section titled “Related Errors”- ORA-27125: Unable to Create Shared Memory Segment — Can occur alongside I/O misconfiguration on some Linux platforms
- ORA-01578: ORACLE Data Block Corrupted — Improper async I/O on NFS without correct mount options has been associated with block corruption in some configurations
Version Notes
Section titled “Version Notes”| Version | Notes |
|---|---|
| Oracle 9i | Parameter introduced |
| Oracle 10g | SETALL recommended for Linux and AIX production environments |
| Oracle 11g | No functional changes; dNFS introduced as alternative to FILESYSTEMIO_OPTIONS for NFS |
| Oracle 12c+ | Fully supported for CDB/PDB architectures; applies at CDB level |
| Oracle 19c+ | SETALL remains the standard recommendation for Linux production databases on file systems |
| Oracle 21c / 23ai | Behavior unchanged; Exadata and cloud configurations manage this automatically |