<< Back to shouce.jb51.net

9.7. Direct I/O

Direct I/O is a feature of the file system whereby file reads and writes go directly from the applications to the storage device, bypassing the operating system read and write caches. Direct I/O is used by only a few applications that manage their own caches, such as databases.

Direct I/O is invoked by an application opening a file with the O_DIRECT flag. Alternatively, GFS can attach a direct I/O attribute to a file, in which case direct I/O is used regardless of how the file is opened.

When a file is opened with O_DIRECT, or when a GFS direct I/O attribute is attached to a file, all I/O operations must be done in block-size multiples of 512 bytes. The memory being read from or written to must also be 512-byte aligned.

One of the following methods can be used to enable direct I/O on a file:

9.7.1. O_DIRECT

If an application uses the O_DIRECT flag on an open() system call, direct I/O is used for the opened file.

To cause the O_DIRECT flag to be defined with recent glibc libraries, define _GNU_SOURCE at the beginning of a source file before any includes, or define it on the cc line when compiling.

NoteNote
 

Linux kernels from some distributions do not support use of the O_DIRECT flag.

9.7.2. GFS File Attribute

The gfs_tool command can be used to assign a direct I/O attribute flag, directio, to a regular GFS file. The directio flag can also be cleared.

9.7.2.1. Usage

Set Direct I/O Attribute Flag

gfs_tool setflag directio File

Clear Direct I/O Attribute Flag

gfs_tool clearflag directio File

File

Specifies the file where the directio flag is assigned.

9.7.2.2. Example

In this example, the command sets the directio flag on the file named datafile in directory /gfs1/.

gfs_tool setflag directio /gfs1/datafile

9.7.3. GFS Directory Attribute

The gfs_tool command can be used to assign a direct I/O attribute flag, inherit_directio, to a GFS directory. Enabling the inherit_directio flag on a directory causes all newly created regular files in that directory to automatically inherit the directio flag. Also, the inherit_directio flag is inherited by any new subdirectories created in the directory. The inherit_directio flag can also be cleared.

9.7.3.1. Usage

Setting the inherit_directio flag

gfs_tool setflag inherit_directio Directory

Setting the inherit_directio flag

gfs_tool clearflag inherit_directio Directory

Directory

Specifies the directory where the inherit_directio flag is set.

9.7.3.2. Example

In this example, the command sets the inherit_directio flag on the directory named /gfs1/data/.

gfs_tool setflag inherit_directio /gfs1/data/