2026年4月24日 星期五

移除 AFD 設定

AFD (ASM Filter Driver) 是 Oracle 12c 開始引入的新功能,不僅能保護 ASM Disk ,設定上也相對簡單方便,不過未來在 UEK8 (Oracle Linux 9、Kernel 6.12) 及所有 kernel > 5.15 的 Linux 作業系統上, AFD 已被列為不支援;此外,自 Oracle Database 26ai 起亦不再支援 AFD 。這意味著 AFD 將無法於未來環境中使用,若升級過程中未留意此變更,可能導致 AFD driver 無法正常啟動 :

CRS-2758: Resource 'ora.driver.afd' is in an unknown state.

CRS-2807: Resource 'ora.driver.afd' failed to start automatically.

在 RAC 環境中,若是 afd driver 無法啟動,那麼所有由 AFD Disk 組成的 Disk Group 便無法使用, GI 也會因為無法存取放在 Disk Group 裡面的 Voting 與 OCR 而無法啟動,因此當前建議先將 AFD 的設定移除, ASM Disk 回歸由 udev rule 進行設定。

必須所有的 Disk Group 都沒有使用 AFD Disk 的情況下才能夠移除 AFD 設定,若 Disk Group 只有一個 AFD Disk ,則必須新增 Disk 然後替換掉 AFD Disk :

add new disk 🡪 drop afd disk 🡪 unlabel afd disk 🡪 add unlabeled afd disk back

若 Disk Group 有兩顆以上的 AFD Disk ,在空間足夠的情況下可以逐個進行替換 :

drop afd disk 🡪 unlabel afd disk 🡪 add unlabeled afd disk back 🡪 drop afd disk 🡪 unlabel afd disk 🡪 add unlabeled afd disk back 🡪 …

如此循環直到替換掉所有 AFD Disk 。

舉例來說,目前的 DATA dg 只有一個 AFD Disk :


這時候就必須要新增一個 disk 來進行替換,首先編輯 /etc/udev/rules.d/99-oracle-asmdevices.rules :

KERNEL=="sd[b-c]", OWNER="oracle", GROUP="oinstall", MODE="0660"

reload udev rule 進行生效 :

# udevadm control --reload-rules && udevadm trigger

以上RAC 所有節點都要做。

Data dg 加入新的 disk :

SQL> alter diskgroup data add disk '/dev/sdc';

 等到 rebalance 結束後 drop AFD Disk :

SQL> alter diskgroup data drop disk data1;

進入 asmcmd 將 AFD Disk 進行 unlabel :

ASMCMD> afd_unlabel DATA1

將 unlabel 過後的 disk 重新加回 Data dg :

SQL> alter diskgroup data add disk '/dev/sdb';


最後確認已經沒有存在任何 AFD Disk 之後就可以移除 AFD 設定 :


移除 AFD 設定必須停下 RAC 所有節點的 crs ,不能 rolling 更改設定 :

所有節點都要操作 :

# cd /u01/app/oracle/19.21/grid/bin

# ./crsctl stop crs

# ./acfsload stop

# export ORACLE_BASE=/u01/app/oracle

# ./asmcmd afd_deconfigure

AFD-632: Existing AFD installation detected.

AFD-634: Removing previous AFD installation.

AFD-635: Previous AFD components successfully removed.

ASMCMD-9375: error occurred when executing

  /bin/rpm -q sles-release

package sles-release is not installed

Modifying resource dependencies - this may take some time.

# ./acfsload start

# ./crsctl start crs

結束後可以執行 afddriverstate 再次確認 AFD 是否有安裝 :

狀態為 false 表示已經移除 AFD 。



2026年3月29日 星期日

Adaptive Log File Sync


Adaptive Log File Sync 為 Oracle 12c 的新功能,目的在於減少 log file sync 等待事件的延遲,其核心概念在於 user commit 後的行為模式分為兩種 : Post/wait 與 Polling 。

  • Post/wait

為 user session 執行 commit 時的預設機制。當 user 發出 commit 後,會通知 LGWR 進行 redo log 的寫入;在此期間, user session 會進入等待(sleep)狀態,待 LGWR 完成 I/O 寫入並回報後,才會喚醒該 session ;當 user session 收到 LGWR 的回應,即表示此次 commit 已完成,並可繼續後續操作。


這個模式之下好比老闆交代員工一個任務之後,老闆就不管這個任務的進度直到員工主動回報完成,也就是 user 使用 commit 賦予 LGWR 任務之後, user session 就不再管此事,直到 LGWR 告知它任務完成了。

好處是當 user session進入等待 (sleep) 時不會消耗 CPU 資源;壞處是 user session 需要等 LGWR 回報後才能喚醒,這個過程會造成些許的延遲,當 commit rate 極高時, LGWR 必須逐一發送信號給每一個在 log file sync 等待隊列中的 User Session ,這種「一對多」的喚醒工作會讓 LGWR 成為系統瓶頸。

  • Polling

為 Adaptive Log File Sync 機制中新增的模式,與 Post/wait 模式最大的差別在於, user 執行 commit 之後, user session 不會進入等待 (sleep)  模式,而是不斷的主動輪詢 LGWR 完成了沒,主動詢問 LGWR 且收到完成的訊息之後,即表示此次 commit 已完成。

這個模式用同一個比喻下,就好比老闆交代員工一個任務,並且老闆持續追蹤員工進度直到任務完成,也就是 user 使用 commit 賦予 LGWR 任務之後, user session 會主動持續關注 LGWR 是否已經完成它的任務了。

好處是 LGWR 不需要喚醒 user session 的動作,減少延遲,在高 commit rate 的場合中表現較佳;缺點是 user session 必須消耗 CPU 資源來持續輪詢 LGWR 是否完成,如果系統 CPU 資源較緊的話就不適合這個模式。

Adaptive Log File Sync 會依據系統的可用資源來自動切換這兩種模式,用以達到 log file sync 最佳的吞吐量,觀察 LGWR 的 trace 可以知道目前是使用何種模式進行 :

*** 2012-10-02 08:15:47.050

Log file sync switching to polling

Current scheduling delay is 4 usec

 

*** 2012-10-02 08:16:23.325

Log file sync switching to post/wait

Current approximate redo synch write rate is 8 per sec

從 AWR 或者是 v$sysstat 也可以觀察到是否有使用 polling 模式 :


早期這個功能剛推出的時候,於 RAC 環境可能會遭遇到 Bug 25178179 : Several sessions wait on 'log file sync' in a RAC environment ,這個 Bug 導致於 Polling 模式效能不佳,具體的現象為使用 Polling 模式、 log file sync 時間很長但 log file parallel write 時間很短。不過這個 Bug 已經於多數 12.2 的版本進行修復了,在現今的環境當中是不會再遇到這個問題。

最後提一下,如果系統 CPU 資源較緊,不希望使用到 Polling 模式,可以設定隱藏參數 "_use_adaptive_log_file_sync" = FALSE 來關閉 adaptive log file sync 功能,參數可以動態更改。

2026年2月27日 星期五

Log File Sync 事件分析

在 Oracle 資料庫進行 commit 的行為就會產生 log file sync 事件,對於一個交易型的系統來說,理解 log file sync 是非常重要的一件事, log file sync 等待時間的長短往往直接決定了交易型系統的整體效能。

log file sync 等待事件指的是 commit 從開始到結束整個過程,流程大致如下 :


user session 執行 commit 指令,此時會通知 LGWR 將 redo buffer 的信息寫入 redo log , LGWR 接收到通知後,開始進行 I/O 寫入的動作,完成後告知 user session 完成整個 commit 的流程。

log file sync 一定會伴隨著 log file parallel write 事件,也就是中間 LGWR 進行 I/O 寫入的過程,當發生 log file sync 的效能問題時,必須與 log file parallel write 等待事件一起分析,因為有可能是 I/O 效能不佳進而增加整個 log file sync 等待時間。

一般 log file sync 等待時間過長有幾種可能 :

  • redo log 切換太頻繁

Redo Log 切換太頻繁往往是影響 log file sync 等待時間的主因,頻繁的 commit 或 rollback ,或是 redo log 的大小與數量不合適都有可能造成 redo log 切換太頻繁。

  • LGWR 的 I/O 性能不佳

I/O 性能不佳也是造成 log file sync 事件拉長的原因之一, LGWR 寫入的速度來不及處理頻繁的 commit 行為,也就是 log file parallel write 的時間過長。

從 AWR Report 看到 log file sync 等待事件時,可以從幾個方向開始分析 :


首先必須檢查資料庫的 alert log ,先確認是否有 redo log 切換太頻繁的問題,如果 alert log 有顯示出大量的 Checkpoint not complete 訊息,那就表示 redo log 因為來不及切換導致等待事件發生 :

如果有這種現象,那就表示 redo log 數量不足,或者是 redo log 大小不合適,那麼只需調整 redo log 數量與大小即可。

若是沒有這個現象,那就表示沒有 redo log 切換太頻繁的問題,此時就很有可能是 I/O 效能的問題,可以檢查 AWR 的 Background Wait Events 是否 log file parallel write 的等待時間過長,或者是從 lgwr 的 trace file 檢查 LGWR 的寫入速度 :

以這個例子來說, LGWR 只有寫入幾 KB 或是幾十 KB 就需要十幾秒甚或至百秒,那就可以確定 I/O 的效能有問題,此時就必須請系統管理員協助處理 I/O 效能的問題。

當發生 log file sync 效能問題時,除了檢查 alert log 、 lgwr trace 之外, DB 層面還可以收集 ASH (dba_hist_active_sess_history 、 wrh$_active_session_history) 資訊 ,作業系統層面可以收集監控資訊如 OSWatcher 、 NMON …等,更進一步可以執行 strace(Linux) 、 truss(AIX) 例如 :

# strace -rfttT -o /tmp/start_trace.out -p <PID_of_ LGWR process>

透過 strace 可掌握 I/O 行為實際停滯的 system call ,對於深入分析 log file parallel write 等待事件的效能根因具有相當大的幫助。

 

總結 log file sync 等待事件對交易型系統(OLTP)的效能影響相當重大。建議將 redo log 放置於效能較佳、延遲較低的磁碟設備上;同時在應用程式設計上,對交易行為盡量採用批次處理,降低 commit 的發生頻率。透過這些做法,有助於有效縮短 log file sync 的等待時間,進而提升整體交易效能與系統吞吐量。