线上偶尔会有节点访问很慢,从console上看状态又完全没有告警,状态健康,但套接字很高,多次观察超过200就不行了。这里排除weblogic 12的套接字泄露的bug。
其实套接字这个问题困扰我很多年了,以前的理解是IE跟weblogic之间的连接。凡是都要测试,只有测试能验证真伪。做了测试,发现开了几个浏览器,访问系统的时候套接字会上升,只要不访问,套接字就将下来了。然后我想到,如果有功能一直和weblogic一直交互,套接字很可能就一直不释放,验证了几个场景:
1.写了一个jsp,页面上是一个线程sleep 20s,然后用jmeter测试,发现套接字跟jmeter设置的线程数有关,当请求完成后,套接字下降。
2.用jmeter测试JDBC,用select * from test for update,跟上面效果是一样的。
3.还有一个下载的功能,支持同步和异步下载,每当点击下载时,套接字增加1,待下载完毕后,套接字下降。
4.使用quartz定时框架,由于应用代码是一套,多个节点做集群同时会触发定时任务,此时用的是select * from quartz_locks for update锁住表,哪个节点先锁住表就执行,其他都等待。经过测试,这种会使套接字不释放。
测试到这里,我觉得可以证明“有功能一直和weblogic一直交互会导致套接字无法下降”的结论。下一步怎么排除,哪些长时间与中间件交互的功能?那就需要频繁使用jstack,能认出代码堆栈的最好。常常有使用线程池的无法辨认,那就需要在线程池上加上名称,之前的blog上有介绍。定时框架要改造,for update nowait,还有把定时任务放到两个节点上执行,不要每个节点都部署。