天天看點

Linux中的hangcheck-timer子產品

       9.2以前使用一個名為watchdogd的使用者空間監視背景程式來監視叢集的狀态情況,并在出現故障時重新啟動RAC節點。從Oracle9.2開始,此監視背景程式已被名為hangcheck-timer的子產品所代替,該子產品可以更好地解決可用性和可靠性問題。

      hangcheck-計時器被加載到Linux核心中并檢查系統是否挂起。它将設定一個計時器,并在特定的時間量之後檢查該計時器。有一個用于檢查挂起情況的可配置門檻值,如果超過該門檻值,計算機将重新啟動。盡管Oracle CRS并不需要hangcheck-timer子產品,但Oracle強烈建議使用它。

        hangcheck-timer子產品使用了一個基于核心的計時器,該計時器周期性地檢查系統任務排程程式,以捕獲延遲,進而确定系統的運作狀況。如果系統挂起或暫停,則計時器重置該節點。hangcheck-timer子產品使用時間戳計數器(TSC) CPU寄存器,該寄存器在每個時鐘信号處遞增。由于此寄存器由硬體自動更新,是以TCS提供了更精确的時間度量。

      兩個參數,即hangcheck_tick(定義系統檢查頻率,預設60s,oracle建議30s)和hangcheck_margin(定義在重置RAC節點前的最大挂起延時,預設180s,oracle建議180s)來确定節點是否出現故障。hangcheck-timer子產品會根據hangcheck_tick的設定,定時檢查核心。隻要響應時間小于hangcheck_tick+hangcheck_margin,都會認為核心運作正常。否則,就意味着運作異常,子產品會自動重新開機系統。

注意:crs的參數MissCount必須大于hangcheck_tick+hangcheck_margin的和(需考證)miscount的值用crsctl get css misscount查詢,10gR2 linux平台,預設60s

設定hangcheck核心子產品參數:

vi /etc/modprobe.conf

options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180

設定hangcheck核心子產品開機加載

vi /etc/rc.d/rc.local

/sbin/modprobe hangcheck-timer

要立即加載子產品,執行:

modprobe -v hangcheck-timer

檢查加載情況:

[root@zhh1 ~]# lsmod | grep hangcheck_timer

hangcheck_timer        5593 0

Enterprise Edition - Version: 9.2.0.8 to 11.1.0.7

fencing子產品,叫做hangcheck-timer子產品。這個子產品用來代替Watchdog子產品,提供類似的fencing功能。Hangcheck-timer子產品是标準的linux2.4以上的核心中的一個子功能被釋出。

1. hangcheck-timer簡介

Hangcheck-timer應該在系統啟動的時候被加載, 并對于能夠影響RAC節點穩定性的長時間的系統操作HANG進行核心監控。

它運作在核心級别并使用Time Stamp Counter(TSC)來捕捉排程的延遲和節點HANG。這是通過設定一個timer,然後檢查這

個timer的fires情況來判斷是否延遲是否超過了誤差的幅度。如果這個周期超過了允許的時間(也就是hangcheck_tick+hangcheck_margin秒),機器将會被重新開機,如果是CPU資源不足的時候,Hangcheck-timer将不會導緻重新開機。

Hangcheck-timer有三個配置參數:

hangcheck_tick:定義了hangcheck-timer檢查節點是否hang的頻率,機關是秒,預設是60秒

hangcheck_margin:定義期望的和真正的scheduling之間允許的誤差,機關是秒,預設值是180秒

當hangcheck_reboot=1并且滿足下面的公式時,hangcheck-timer将reboot系統system hang time > (hangcheck_tick + hangcheck_margin)

所有的hangcheck-timer的參數的預設值必須在加載核心子產品的時候被顯式的覆寫,不同的oracle版本可以按照下面來設定:

9i: 假如"oracle misscount"的預設設定是220秒,則hangcheck_tick=30 hangcheck_margin=180 hangcheck_reboot=1

10g/11g: 假如"CSS misscount"的設定是30或者60秒,則hangcheck_tick=1 hangcheck_margin=10 hangcheck_reboot=1

不過對于目前大多數的環境,我問了幾個朋友的rac這幾個參數的設定一般為

misscount=220

hangcheck_tick=30

hangcheck_margin=180

注意:你必須設定叢集的misscount值大于hangcheck_tick + hangcheck_margin之和

2. hangcheck-timer.ko子產品安裝:

hangcheck-timer被預設安裝在linux版本 2.4.9-e.12 及之上版本中,可以用如下指令核查hangcheck-timer是否安裝。

[root@rac2 oracle]# find /lib -name "hangcheck-timer.ko"

/lib/modules/2.6.9-78.EL/kernel/drivers/char/hangcheck-timer.ko

/lib/modules/2.6.9-89.0.23.ELxenU/kernel/drivers/char/hangcheck-timer.ko

/lib/modules/2.6.9-78.ELsmp/kernel/drivers/char/hangcheck-timer.ko

有以上輸出,代表已經安裝了

modprobe指令将在子產品路徑/lib/modules/'uname -r'/中搜尋所有的子產品和檔案。

3. 配置hangcheck-timer

修改配置檔案/etc/modprobe.conf ,我的這個檔案的内容如下:

[root@rac2 oracle]# more /etc/modprobe.conf

alias eth0 pcnet32

alias eth1 pcnet32

alias scsi_hostadapter mptbase

alias scsi_hostadapter1 mptscsi

alias scsi_hostadapter2 mptspi

alias scsi_hostadapter3 mptsas

alias scsi_hostadapter4 mptscsih

alias scsi_hostadapter5 ata_piix

[root@rac2 oracle]#

4. 加載hangcheck-timer子產品

這個子產品是在oracle需要時自動調用的,可以不需要用modprobe或insmod指令來放在啟動檔案加載。但是一般的條件下,我們還是把這個指令放在系統引導檔案中。

為了使得在系統啟動的時候就自動加載,可以把上面的指令添加到/etc/rc.d/rc.local或者/etc/init.d/boot.local或者/etc/rc.local中,這個根據不同的發行版來決定。

例如:

# echo "/sbin/modprobe hangcheck-timer" >> /etc/rc.local

說明:

在oracle linux、紅帽linux4/5或者SUSE linux9/10中,hangcheck-timer子產品使用modprobe指令替換insmod指令

(因為modprobe更靈巧些)來進行加載:

# modprobe hangcheck-timer hangcheck_tick=1 hangcheck_margin=10 hangcheck_reboot=1

5. 查證hangcheck-timer的參數是否正确的方法

[root@rac2 ~]# /sbin/lsmod |grep hangcheck

hangcheck_timer         7897  0

hangcheck-timer的啟動資訊都會記錄在系統日志裡“ /var/log/messages”

重新開機時會記錄"Hangcheck: hangcheck is restarting the machine"資訊到/var/log/messages

如果你看到/var/log/messages中有"Hangcheck: hangcheck value past margin!"消息,表示系統需要重新開機但是沒有重新開機,因為hangcheck-reboot參數沒有設定為1。

還可以這樣驗證:

[root@rac2 ~]# su -

[root@rac2 ~]# grep hangcheck /var/log/messages |tail -2

May 10 10:03:56 rac2 kernel: Hangcheck: starting hangcheck timer 0.9.0 (tick is 30 seconds, margin is 180 seconds).

[root@rac2 ~]#

繼續閱讀