故障診斷 Lotus Domino 的掛起和崩潰2

  nsd 分析

確定讓伺服器崩潰的進程通常是解決伺服器崩潰的第一步。在 domino 6 和更高版本中,nsd 檔案是一個很好的起點。nsd 給出伺服器狀態的所有當前信息(所有執行緒的調用堆疊、記憶體信息,等等)。在發生崩潰時,domino 伺服器將自動生成一個 nsd 日誌檔案,並存儲在 data\ibm_technical_support 目錄中。nsd 日誌檔案的檔案名稱中帶有一個時間戳,展示了 nsd 是何時生成的。例如nsd_w32i_kirantp_2006_01_17@17_17_18.log表示這個 nsd 是 2006 年 1 月 17 日生成的。nsd 在運行時,會附加到每個進程和執行緒,以轉儲調用堆疊。這有助於您確定伺服器或工作站崩潰的原因。nsd 檔案的核心是堆疊跟蹤部分。這一部分提供代碼路徑的一個 breakdown,當前存在的進程中的每個執行緒要遍歷該路徑,以進入其當前狀態。這對於考察伺服器上的掛起或崩潰場景非常有幫助。此外,通過檢查 nsd 檔案,可以找到 domino data 目錄中生成的任何核心檔案,並進行基本的分析,以跟蹤死去並遺留下核心檔案的進程所做調用的最終堆疊。在諸如 domino 這樣的複雜產品中,兩台不同伺服器上相同類型的動作的堆疊跟蹤可以產生不同的結果。

在 nsd 檔案中,通過執行對單詞 “fatal”、“panic” 或 “segmentation” 的搜尋,可以識別失敗進程中的可執行部分。找到進程後,我們可以看出誰在它之前,並有望確定崩潰是如何發生的。有時,當 “panic”、“fatal” 都沒有找到時,核心轉儲將包含對函式中 “segmentation fault” 的引用。這表明,進程試圖訪問因某種原因已破壞的共享記憶體段,並將不調用 “fatal_error” 或 “panic” 而崩潰。

下面是 nsd 檔案的示例摘錄,其中的一個伺服器進程涉及到崩潰:

### fatal thread 39/83 [ nserver:07c0: 2764]
### fp=0743f548, pc=60197cf3, sp=0743ebd0, stksize=2424
exception code: c0000005 (access_violation)
############################################################
@[ 1] 0x60197cf3 nnotes._panic@4+483(7430016,496dae76,0,496dace8)
@[ 2] 0x600018a4 nnotes._osbblockaddr@8+148(1153f38,2000000,743f608,1)
@[ 3] 0x6000bd92 nnotes._collectionnavigate@24+610(0,743fc74,f,0)
@[ 4] 0x600626cc nnotes._readentries@68+2860(4c5440e8,4cfb8dba,800f,1)
@[ 5] 0x600b9f6f nnotes._nifreadentriesext@72+351(0,4cfb8dba,800f,1)
@[ 6] 0x10032d40nserverl._serverreadentries@8+1424(0,8d0c0035,4b64b5bc,4ae46dd6)
@[ 7] 0x100191fc nserverl._dbserver@8+2284(41b0383,cb740064,0,23696f8)
@[ 8] 0x1002b8c8 nserverl._workthreadtask@8+1576 (4711d68,0,3,563fb10)
@[ 9] 0x100016cb nserverl._scheduler@4+763(0,563fb10,0,10ec334)
@[10] 0x6011e5e4 nnotes._threadwrapper@4+212 (0,10ec334,563fb10,0)
@[11] 0x77e887dd kernel32.getmodulefilenamea+465

當確定了失敗進程後,您就可以著重故障診斷這個特定的進程了。

servertasks

如果一台伺服器不斷地崩潰(例如,每五分鐘一次),一個有用的故障診斷步驟是,從伺服器的 notes.ini 檔案臨時刪除 servertasks= 行。然後,伺服器可以重新啟動,任務可以單獨地載入,以確定是哪個進程導致崩潰。

panic 訊息

當 domino 檢測到一個內部一致性錯誤,或者一個可能導致數據破壞或其他問題的條件時,它會立即調用一個名為 panic 的子例程。這是在代碼操作時,用於不斷監控代碼的關鍵部分的一種特殊構造。這有助於在問題升級並可能破壞數據之前,儘可能早地捕捉問題。當發生 panic 時,它將導致系統停止(因此可看成是一種可控制的崩潰)。panics 產生的訊息,有時是英語形式的,有時是代碼形式的(例如,panic: 04:3c)。您可以將該代碼提交給 lotus software technical support,以便進一步故障診斷。

故障診斷工具

本節介紹您在遇到 domino 伺服器崩潰或掛起時可用的一些故障診斷工具。在使用任何這些工具之前,請確保參考 domino 管理文檔。此外,domino 自助支持頁面 對於故障診斷信息也是一個好的資源。

rip(domino r5)

rip 檔案是在伺服器崩潰時產生的。該檔案包含關於伺服器崩潰時在做什麼的信息。它報告系統上的任何崩潰,而不只是與 domino 有關的崩潰。rip 檔案只在 domino 5.x 中才產生。在 domino 6 和更高版本中,nsd 取代了 rip,並且還包括 rip 中沒有的附加功能。

要產生 rip 檔案,需要將 qnc.exe 載入到 domino 伺服器上。qnc.exe 程式(通常叫做 “quincy”)是與 domino 一起發布的默認調試程式。qnc.exe 程式通常位於 \domino 目錄中。要啟用 qnc.exe,請在作業系統的命令提示符下輸入 “qnc –i”。也可以通過在伺服器啟動時輸入 “qnc nserver” 啟動 qnc.exe。如果在伺服器崩潰時不生成 rip 檔案,那么請檢查 qnc.exe 是否已啟用。通常,rip 檔案創建在 data 目錄中。

nsd(domino 6 和更高版本)

如前所述,domino 6 和更高版本提供 nsd 特性。這個檔案包含關於伺服器崩潰時的狀態信息。有關更多信息,請參閱本文前面的 “nsd 分析” 一節。

記憶體轉儲(domino 6 和更高版本)

在 domino 6 和更高版本中,可以在伺服器控制台上使用命令 “sh memory dump” 來創建記憶體轉儲檔案。記憶體轉儲檔案包含關於 domino 當前使用的記憶體的信息。這在故障診斷性能問題和記憶體泄漏時非常有用。通常,記憶體轉儲檔案位於 data\ibm_technical_support 目錄中。記憶體轉儲檔案名稱包含一個時間戳,表示生成 nsd 時的時間。例如:

memory_kirantp_2005_09_14@17_50_08.dmp

注意:要將可用記憶體記錄到檔案,而不是在伺服器控制台上查看它,請輸入下面的伺服器控制台命令: sh memory dump >memory.txt

http 請求日誌

為了故障診斷與 domino web 伺服器崩潰和掛起有關的問題,lotus software technical support 通常會要求您創建 http 請求日誌。要為請求日誌啟用默認設定,請編輯伺服器的 notes.ini 檔案,並添加 httpenablethreaddebug=1 這一行。這將 http 請求日誌記錄設定為默認級別。(要將日誌記錄級別設定為記錄更詳細的信息,請參閱 domino 管理文檔。)也可以通過在 domino 伺服器控制台輸入 “tell http debug thread on | off” 動態地啟用 http 請求日誌記錄。啟用了 http 請求日誌記錄之後,domino 就會創建一系列名為 htthr*.log 的檔案,例如 [email protected]

http 請求日誌記錄應該只用於故障診斷特定的問題,並且通常是在 lotus software technical support 的指導和幫助下完成的。不要將請求日誌記錄用於其他目的,比如一般管理。這些日誌檔案隨著時間會不斷增大,所以不應該長時間啟用該設定,否則會消耗掉所有可用的設備空間。

automatic data collection

notes/domino 6.0.1 引入了自動診斷數據收集工具,也叫做 automatic data collection,或者簡稱為 adc。automatic data collection 只意味著,當 notes 客戶機或 domino 伺服器崩潰時,該程式將收集調試崩潰時必需的所有數據,並在客戶機或伺服器重啟時傳送到一個 mail-in 資料庫。然後,管理員就每個域具有一個位置,在這裡,他們可以看到所有客戶機和伺服器已經發生的所有崩潰。這將有助於消除這樣的情況,即管理員或用戶在客戶機或伺服器崩潰時不能捕獲適當的數據。