一測試伺服器資料庫(Oracle Database 10g Release 10.2.0.5.0 - 64bit Production)突然訪問不了,檢查發現資料庫處於掛起模式(hang mode),檢查告警日誌,發現有“ksvcreate: Process(m000) creation faile...
一測試伺服器資料庫(Oracle Database 10g Release 10.2.0.5.0 - 64bit Production)突然訪問不了,檢查發現資料庫處於掛起模式(hang mode),檢查告警日誌,發現有“ksvcreate: Process(m000) creation failed”,”kkjcre1p: unable to spawn jobq slave process“之類的錯誤信息。具體如下所示:
Sun Jan 17 09:56:05 CST 2016
Thread 1 advanced to log sequence 1729 (LGWR switch)
Current log# 1 seq# 1729 mem# 0: /u01/oradata/SCM2/redo01.log
Sun Jan 17 21:34:01 CST 2016
Thread 1 advanced to log sequence 1730 (LGWR switch)
Current log# 2 seq# 1730 mem# 0: /u01/oradata/SCM2/redo02.log
Mon Jan 18 09:06:00 CST 2016
ksvcreate: Process(m000) creation failed
Mon Jan 18 09:12:50 CST 2016
WARNING: inbound connection timed out (ORA-3136)
Mon Jan 18 09:37:13 CST 2016
Thread 1 advanced to log sequence 1731 (LGWR switch)
Current log# 3 seq# 1731 mem# 0: /u01/oradata/SCM2/redo03.log
Mon Jan 18 09:43:10 CST 2016
kkjcre1p: unable to spawn jobq slave process
Mon Jan 18 09:43:10 CST 2016
Errors in file /u01/app/oracle/admin/SCM2/bdump/scm2_cjq0_586.trc:
當時開發人員急著測試,沒時間給我研究具體原因,所以就重啟了資料庫實例(不能通過shutdown immeidate關閉,只能通過shutdown abort關閉)。
關於告警日誌裡面的錯誤信息,我們看出m000進程創建失敗,PMON進程無法啟動該進程。一般情況下,PMON無法啟動進程原因有下麵一些:
1、Oracle連接數超過進程數限制。(正是由於Oracle達到了進程數限制,進而PMON無法創建m000進程)
2、進程死鎖。
Bug 8426816 PMON may hang cleaning up a dead process (rare)
3、Bug引起的
Database hangs With Message 'Ksvcreate: Process(M001) Creation Failed' (文檔 ID 1233079.1) |
事後我檢查了一下v$resource_limit,發現會話連接數、進程數並沒有超。那麼完全可以排除這個因素,那麼現在就有可能是進程死鎖或bug造成的
同事在檢查過程中發現Physic memory資源嚴重不足,引起了Swap頻繁讀寫。繼續檢查SGA參數發現sga_max_size、sga_target設置過大(這台測試伺服器是虛擬機做的克隆,生產環境的RAM為64G,SGA也設置較大,克隆過後ORACLE實例啟動不了,調整了SGA_TARGET、SGA_MAX_SIZE等參數後才啟動成功,但是不知為什麼sga_max_size設置了成了11264M(11G),有可能是當時要設置為1G多,因為物理記憶體才3G多,但是不知是手抖了還是搞暈了,當然也不排除後面被人改掉,居然設置成了11264M大小,汗顏啊。居然運行了這麼久直到最近才出現問題,測試資料庫基本不會做巡檢)
然後在Troubleshooting Guide (TSG) - Ksvcreate: Process(xxxx) Creation Failed / ORA-00445: Background Process "xxxx" Did Not Start After n Seconds (文檔 ID 1379200.1) 裡面發現當OS的資源或設置不正確時,尤其是物理記憶體或swap不足時,將會導致不能生成新的進程。英文原文如下:
OS Configuration Checks
This error may be observed due to lack of OS resources or incorrect configuration, typically memory or swap may be insufficient to spawn a new process. Please check the list below to verify the OS settings and configuration
當然關於這點我和同事有些爭議。不過我認為是這些導致資料庫出現這些問題的。修改SGA相關參數應該能解決這個問題,不過還需觀察一段時間。
另外,關於kswapd0進程,在博客調整linux內核儘量用記憶體,而不用swap裡面有較詳細介紹,摘抄部分內容如下所示:
Linux uses kswapd for virtual memory management such that pages that havebeen recently accessed are kept in memory and less active pages are paged outto disk.
(what is a page?)…Linux uses manages memory in units called pages.
So,the kswapd process regularly decreases the ages of unreferencedpages…and at the end they are paged out(moved out) to disk
kswapd0進程的作用:它是虛擬記憶體管理中,負責換頁的,操作系統每過一定時間就會喚醒kswapd ,看看記憶體是否緊張,如果不緊張,則睡眠,在 kswapd 中,有2 個閥值,pages_hige 和 pages_low,當空閑記憶體頁的數量低於 pages_low的時候,kswapd進程就會掃描記憶體並且每次釋放出32 個free pages,直到 free page 的數量到達pages_high。
physical mem 不足,引起 swap 頻繁讀寫。kswapd0 是系統的虛擬記憶體管理程式,如果物理記憶體不夠用,系統就會喚醒 kswapd0 進程,由 kswapd0 分配磁碟交換空間作緩存,因而占用大量的 CPU 資源。
參考資料:
http://www.myjishu.com/?p=80
http://www.nowamagic.net/librarys/veda/detail/2539