最近在研究如何在IO競爭的情況下,如果儲存層級已經無法最佳化,還有其他什麼辦法解決IO競爭問題。最後想到了非同步IO。
我的redo寫磁碟的速度已經達到了最大值,無論我如何調整redo大小和組數,無論我如何調整檢查點頻率都沒有什麼用處。調整redo大小,之後減少redo切換的頻率,增加redo組數只是為了避免所有redo都已經沒使用但是業務仍然需要新的日誌來記錄資料更改。可是如果IO不給力,會造成一堆redo都依然不夠的局面。也許非同步IO是你最後一招了,那就試試吧。
客戶的資料庫IO負載較重,檢查後發現並未設定非同步IO。
整個資料庫的負載都集中在IO相關的等待上:
Top 5 Timed Foreground Events
Event |
Waits |
Time(s) |
Avg wait (ms) |
% DB time |
Wait Class |
log file sync |
697,116 |
70,128 |
101 |
36.29 |
Commit |
db file sequential read |
2,982,135 |
54,498 |
18 |
28.20 |
User I/O |
db file scattered read |
754,680 |
38,741 |
51 |
20.05 |
User I/O |
free buffer waits |
35,410 |
20,560 |
581 |
10.64 |
Configuration |
DB CPU |
|
6,172 |
|
3.19 |
|
檢查後發現,當前系統並未使用非同步io:
[Oracle@localhost ~]$ cat /proc/slabinfo | grep kio
kioctx 37 140 384 10 1 : tunables 54 27 8 : slabdata 14 14 0
kiocb 0 0 256 15 1 : tunables 120 60 8 : slabdata 0 0 0
返回結果中kiocp對應的前兩項為0,說明系統中沒有使用非同步io。
檢查顯示oracle已經連結了aio的包:
[oracle@localhost ~]$ /usr/bin/ldd $ORACLE_HOME/bin/oracle | grep libaio
libaio.so.1 => /lib64/libaio.so.1 (0x0000003e13000000)
而資料庫中檢查發現filesystemio_options設定有誤:
SQL> show parameter disk_asynch_io
NAME TYPE VALUE
------------------------------------ -------------------------------- --------------------
disk_asynch_io boolean TRUE
SQL> show parameter filesystemio_options
NAME TYPE VALUE
------------------------------------ -------------------------------- -------------------
filesystemio_options string none
當前使用的是檔案系統,因此需要將filesystemio_options設定為asynch,才能開啟非同步io:
SQL> ALTER SYSTEM SET FILESYSTEMIO_OPTIONS = ASYNCH SCOPE = SPFILE;
System altered.
SQL> SHUTDOWN IMMEDIATE
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> STARTUP
ORACLE instance started.
Total System Global Area 6.0264E+10 bytes
Fixed Size 2242912 bytes
Variable Size 2147485344 bytes
Database Buffers 5.7982E+10 bytes
Redo Buffers 131960832 bytes
Database mounted.
Database opened.
SQL>
再次檢查系統上非同步io的設定,發現非同步io已經啟動:
[oracle@localhost ~]$ more /proc/slabinfo |grep kio
kioctx 130 160 384 10 1 : tunables 54 27 8 : slabdata 16 16 0
kiocb 16 30 256 15 1 : tunables 120 60 8 : slabdata 2 2 1
可以看到,目前非同步IO已經生效。
在Linux上Oracle如何啟用非同步IO?
多Oracle相關資訊見