一则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%之上,优先交换非计算内存。
至于刚上线的时候是正常的,为什么运行一段时间以后才不正常,可能是因为连接数的增加,导致系统消耗以及内存增加,慢慢的达到了临界点。

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