一則ORA-12500錯誤的解決案例

2008年04月15日

一則ORA-12500錯誤的解決案例

環境:

OS:AIX 5.3
$oslevel -s
5300-06-04-0748
DB:Oracle 9206

我們的一臺生產環境,突然系統監測到大量的連接失敗,通過監聽的日誌,可以發現部分連接是成功的,部分連接是失敗的。如

成功的連接

14-APR-2008 21:08:31 * (connect_data=(service_name=feel)(server=dedicated)(CID=(PROGRAM=java)(HOST=shop48.cm2)(USER=admin))) * (ADDR
ESS=(PROTOCOL=tcp)(HOST=172.19.26.48)(PORT=49288)) * establish * feel * 0

失敗的連接

14-APR-2008 21:08:31 * (connect_data=(service_name=feel)(server=dedicated)(CID=(PROGRAM=java)(HOST=app131)(USER=admin))) * (ADDRESS=
(PROTOCOL=tcp)(HOST=192.168.60.131)(PORT=55076)) * establish * feel * 12500
TNS-12500: TNS:listener failed to start a dedicated server process
TNS-12540: TNS:internal limit restriction exceeded
TNS-12560: TNS:protocol adapter error
TNS-00510: Internal limit restriction exceeded
IBM/AIX RISC System/6000 Error: 12: Not enough space

 

失敗的連接反饋給前端的錯誤是Ora-12500錯誤,系統級別的錯誤是internal limit restriction exceeded,以及錯誤12:Not enough space。通常,AIX的錯誤12都是指內存不夠,但是這個系統的總內存是64G,還存在大量剩餘空間,交換空間的使用率也不超過2%。
開始以爲是連接數與文件句柄的限制,但是修改了系統參數maxuproc(每用戶的最大進程限制)從2000到5000(系統當時實際使用的進程數小於1000個),用戶文件句柄限制ofiles(descriptors)從4000到5000,都沒有效果。
根據錯誤類型12,還是把問題定位在內存上面,查看SGA大小,佔了45G,約系統總內存的70%,加上系統自身要消耗10%的內存,合計80%的內存,這部分內存是不能交換的,而OS的系統參數maxpin%正好默認是80%,修改maxpin%到90%,問題解決,所有的連接正常。
正常情況下,系統的內存分計算內存與非計算內存(如文件系統cache),SGA與系統的這部分內存都屬於計算內存,在AIX的早期版本(如Aix 5.2),如果內存不夠,這部分內存是可以交換的,但是後期的版本,如Aix 5.3以後,因爲large page的引進,這部分內存是長駐內存而不能交換的(不知道是進步還是退步)。所以,當這部分內存達到maxpin%的時候,就會發生內存不夠,如果超出,就會發生系統hang住,所有的連接都無法進入,我們的這個實際案例是幸運的,只是在臨界點附近顛簸,並沒有引起系統的癱瘓。
修改maxpin%是一個解決方法,但同時也要注意maxperm%,maxclient%與minperm%的正確設置,以及其它內存的使用,因爲除了系統以及SGA之外,還有進程空間(進程使用內存,有一部分是可交換的,有一部分也是屬於系統級別,不可交換的),以及文件系統Cache,設置lru_file_repage=0,可以保證在minperm%之上,優先交換非計算內存。
至於剛上線的時候是正常的,爲什麼運行一段時間以後纔不正常,可能是因爲連接數的增加,導致系統消耗以及內存增加,慢慢的達到了臨界點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章