下面是一个有关的案例。一套运行在AIX 5.3上的RAC,版本为10.2.0.4,这套在sqlnet.ora文件中有设置sqlnet.expire_time=5,后果却是,的连接数过几天就要满一次,防火墙设置的时间是8小时,也就是说只会切断空闲时间超过8小时的连接,这个时间已经足够长,晚上系统太闲,总会有部分连接空闲时间过长,但是由于设置了DCD,连接应该不会被防火墙切断,而即使防火墙切断了连接,那么在DCD的作用下,服务器端的会话和进程也应该被清理才是,即使DCD不起作用,那TCP keep-alive也应该起作用才是,那为什么会话和进程数越来越多,甚至达到了最大进程数或会话数呢?
检查应用服务器(weblogic)的连接池,并核对应用服务器到的TCP连接,发现连接池监控中的连接数量并不多,而对比应用服务器上看到的到的TCP连接数量和数据器上看到的应用服务器建立过来的TCP连接数量,二者之间差距非常大,前者远远小于后者,就是说,大量的连接已经被切断,应用服务器的连接已经退出,但是端的连接还没有释放。从weblogic的日志来看,经常出现类似于连接失效并建立新的连接这样的信息。
DCD为什么没有起作用,是不是DCD的BUG?DCD的确是有很多BUG,但是完全不工作的BUG应该是很少的。将sqlnet.expire_time设为1,5以及其他值,都不起作用,甚至重启过主机都没有起作用(当然并不是专门为了DCD而重启主机)。
使用truss命令来跟踪Oracle进程:
SQL> host $ truss -p 828090 kread(0, 0x0000000000000000, 0) (sleeping...) ...很长时间没有任何反应... ^CPstatus: process is not stopped $ $ exit SQL> oradebug setospid 828090 Oracle pid: 247, Unix process pid: 828090, image: oracle@db2 SQL> oradebug short_stack ksdxfstk+002c<-ksdxcb+04e4<-sspuser+0074<-000044C0<-nttrd+0120<-nsprecv+07a0<-nsrdr+0114<-nsdo+1710<-nsbrecv+0040<-nioqrc+04a8<-opikndf2+0688<-opitsk+08a8<-opiino+0990<-opiodr+0ae0<-opidrv+0484<-sou2o+0090<-opimai_real+01bc<-main+0098<-__start+0098 SQL> oradebug short_stack ksdxfstk+002c<-ksdxcb+04e4<-sspuser+0074<-000044C0<-nttrd+0120<-nsprecv+07a0<-nsrdr+0114<-nsdo+1710<-nsbrecv+0040<-nioqrc+04a8<-opikndf2+0688<-opitsk+08a8<-opiino+0990<-opiodr+0ae0<-opidrv+0484<-sou2o+0090<-opimai_real+01bc<-main+0098<-__start+0098
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-30053-8.html
里有一句话