同步 I/O 与异步 I/O 对于同步 I/O,发出 I/O 请求的 Oracle 进程必须等到请求完成后才能执行任何其他操作。例如,如果它启动了对几个块的读取,则该进程必须等到所有块都已读入内存后才能执行任何操作。使用异步 I/O,进程可以与 I/O 同时执行工作,或者在数据到达时开始处理每个块中的数据

参数 FILESYSTEMIO_OPTIONS 控制操作系统给出的 I/O 选项的行为,但在使用 ASM 时没有影响。当值设置为 SETALL/ASYNC 时,FILESYSTEMIO_OPTIONS 启用异步 I/O (AIO)。但是,在这种情况下,ASM 会绕过文件系统层,因为 ASM I/O 完全由 DISK_ASYNCH_IO 参数控制。需要通过将 disk_asynch_io 设置为参数值 TRUE/FALSE 来启用/禁用 AIO。

异步IO检查 slabinfo 维护有关内存中对象的统计信息。异步 I/O 使用的一些结构体被视为虚拟内存中的对象,因此我们可以在slabinfo 上查找这些结构体。与 AIO 相关的那些被命名为 kio*。

  1. 查看slabinfo
$ cat /proc/slabinfo | grep kio
由于 Oracle Linux 提供不同的内核(包括 RedHat Compatiable Kernel、Oracle UEK1/UEK2/UEK3),输出可能略有不同。
  • 启用了异步 I/O
$ cat /proc/slabinfo | grep kio
kioctx 270 270 128 9 9 1 : 252 126
kiocb 66080 66080 96 1652 1652 1 : 252 126
kiobuf 236 236 64 4 4 1 : 252 126
or
kioctx 518 670 384 10 1 : tunables 54 27 8 : slabdata 67 67 0
kiocb 595 720 256 15 1 : tunables 120 60 8 : slabdata 48 48 60 
  • 未启用异步IO:
$ cat /proc/slabinfo | grep kio
kioctx 0 0 128 0 0 1 : 252 126
kiocb 0 0 96 0 0 1 : 252 126
kiobuf 0 0 64 0 0 1 : 252 126
or

kioctx 0 0 384 10 1 : tunables 54 27 8 : slabdata 0 0 0
kiocb 0 0 256 15 1 : tunables 120 60 8 : slabdata 0 0 0

2. strace

查看dbw进程是否调用了io_submit及io_getevents进行判断。
[root@trlnx4 tmp]# ps -ef|grep dbw
oracle   10131     1  0 15:53 ?        00:00:00 ora_dbw0_DB2
...
strace -af -p 10131 -o dbw.txt &
In a new sqlplus session (database instance), tablespace is created.
sqlplus / as sysdba
sql> create tablespace test1 datafile '+DG1' size 100M;
  • 启用了异步 I/O
io_submit(3071864832, 1, {{0xb7302e34, 0, 1, 0, 21}}) = 1
gettimeofday({1176916625, 58882}, NULL) = 0
io_getevents(-1223102464, 1, 1024, {{0xb7302e34, 0xb7302e34, 8192, 0}}, {600, 0}) = 1
  • 未启用异步IO:
pwrite64(21, "\6\242\0\0004\21\300\0\220B\243\0\0\0\1\6\207\357\0\0\1"..., 8192, 36077568) = 8192
times(NULL) = 1775653082
times(NULL) = 1775653082
pwrite64(21, "\6\242\0\0<\21\300\0\220B\243\0\0\0\1\6\254\0\0\0\2\0*"..., 8192, 36143104) = 8192

How To Check if Asynchronous I/O is Working On Linux (Doc ID 237299.1)