Skip to content

FILESYSTEMIO_OPTIONS - Configure Oracle Direct & Async I/O

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)

-- Check current FILESYSTEMIO_OPTIONS setting
SELECT name, value, isdefault, ismodified, description
FROM v$parameter
WHERE name = 'filesystemio_options';
-- Check SPFILE value
SELECT name, value, isspecified
FROM v$spparameter
WHERE name = 'filesystemio_options';
-- Review all I/O-related parameters together
SELECT name, value, isdefault
FROM v$parameter
WHERE name IN (
'filesystemio_options',
'disk_asynch_io',
'db_file_multiblock_read_count',
'db_writer_processes'
)
ORDER BY name;
-- 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 restart
SELECT name, value
FROM v$parameter
WHERE name = 'filesystemio_options';
Platform / StorageRecommended Value
Linux + ext4/XFS + file system datafilesSETALL
Linux + NFS (with async mount option)SETALL
AIX + JFS2SETALL
Solaris + UFSSETALL
Windows NTFSNONE (Windows handles async differently)
Oracle ASM disk groupsNot applicable — ASM bypasses file system
Exadata Smart StorageSETALL (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.

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 DIRECTIO
SELECT name, value
FROM v$sysstat
WHERE 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 usage
SELECT event, total_waits, time_waited,
ROUND(time_waited / NULLIF(total_waits, 0), 2) AS avg_wait_centisecs
FROM v$system_event
WHERE 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 changing
SELECT metric_name, average, maximum
FROM v$sysmetric_summary
WHERE 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;
-- Monitor direct reads vs cached reads ratio
SELECT ROUND(direct.value / NULLIF(total.value, 0) * 100, 2) AS direct_read_pct
FROM v$sysstat direct, v$sysstat total
WHERE direct.name = 'physical reads direct'
AND total.name = 'physical reads';
-- Check I/O throughput by file after changing to SETALL
SELECT f.name,
s.phyrds, s.phywrts,
s.readtim, s.writetim
FROM v$datafile f
JOIN v$filestat s ON f.file# = s.file#
WHERE s.phyrds + s.phywrts > 0
ORDER 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 alongside
SELECT name, value
FROM v$sysstat
WHERE name LIKE '%physical read%'
ORDER BY name;

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, value
FROM v$parameter
WHERE name = 'filesystemio_options';
-- Then review OS-level NFS mount options: mount | grep nfs

Issue 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/O
SELECT ROUND((1 - (phys.value / (db_gets.value + cons_gets.value))) * 100, 2)
AS buffer_cache_hit_pct
FROM v$sysstat phys, v$sysstat db_gets, v$sysstat cons_gets
WHERE 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 datafiles
SELECT file#, name, status
FROM v$datafile
ORDER BY file#;
-- If paths begin with '+', they are ASM and unaffected by this parameter
  • 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
VersionNotes
Oracle 9iParameter introduced
Oracle 10gSETALL recommended for Linux and AIX production environments
Oracle 11gNo 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 / 23aiBehavior unchanged; Exadata and cloud configurations manage this automatically