Kernel Asynchronous I/O (AIO) Support for Linux (original) (raw)
Kernel Asynchronous I/O (AIO) Support for Linux
Overview
AIO enables even a single application thread to overlap I/O operations with other processing, by providing an interface for submitting one or more I/O requests in one system call (io_submit()) without waiting for completion, and a separate interface (io_getevents()) to reap completed I/O operations associated with a given completion group.
Support for kernel AIO has been included in the 2.6 Linux kernel.
What Works?
- AIO read and write on raw (and O_DIRECT on blockdev)
- AIO read and write on files opened with O_DIRECT on ext2, ext3, jfs, xfs
What Does Not Work?
- AIO read and write on files opened without O_DIRECT (i.e. normal buffered filesystem AIO). On ext2, ext3, jfs, xfs and nfs, these do not return an explicit error, but quietly default to synchronous or rather non-AIO behaviour (i.e io_submit waits for I/O to complete in these cases). For most other filesystems, -EINVAL is reported.
- AIO fsync (not supported for any filesystem)
- AIO read and write on sockets (doesn't return an explicit error, but quietly defaults to synchronous or rather non-AIO behavior)
- AIO read and write on pipes (reports -EINVAL)
- Not all devices (including TTY) support AIO (typically return -EINVAL)
Additional functionality is available HERE
- Buffered filesystem AIO, i.e. AIO read and write on files opened without O_DIRECT, on ext2, ext3, jfs, xfs, reiserfs.
- Does not include AIO fsync
- AIO read and write on pipes (from Chris Mason)
Q. Where can I find AIO libraries that utilize kernel AIO on Linux ?
A. You need to install the libaio package if you are writing AIO applications which use the native AIO interfaces (libaio-0.3.99)
Q. Is AIO functionality available for 2.4 kernels?
A. Patches for 2.4 can be found HERE . Also check out the original Linux-AIO home page.
Reading About the Linux Kernel AIO Design
- Asynchronous I/O Support Linux 2.5, Ottawa Linux Symposium 2003
Covers the AIO design for 2.6, including the filesystem AIO implementation that's currently in the -mm tree, and some performance results for O_DIRECT AIO using rawiobench. - AIO Design Notes written at the time of the 2.4 AIO implementation, These are a little out-of-date, but provide some idea and background on various issues, alternative design approaches and considerations involved in an AIO implementation and describes the design of the 2.4 AIO implementation.
- Round 3: aio vs /dev/epoll compares epoll, AIO poll and AIO read behaviour. The full paper is included in the OLS 2002 Proceedings.
Future Work
- Performance Tuning
- Vector AIO
Benchmarks and Testing
Performance testing/microbenchmarking
- Chris Mason's aio-stress benchmark issues a stream of AIO requests to one or more files, where one can vary several parameters like I/O unit size, total I/O size, depth of iocbs submitted at a time, number of concurrent threads, type and pattern of I/O operations, etc. It reports the overall throughput attained and average io submission latency.
- rawiobench is another microbenchmark which can issue sequential or random disk I/O. It supports both synchronous and asynchronous I/O for O_DIRECT and buffered filesystem AIO and reports throughput and CPU utilization results. Other tests AIO tests:
- Daniel McNiel's (OSDL) aiocp test.
- fsx-linuxis now enabled for AIO. Just compile it with -DAIO.
Performance Results
- Filesystem AIO aiostress resultswith and without fsaio patches