SSL握手问题
我们的服务器应用程序在某些客户中的速度极慢。缓慢通过服务器重新启动来解决,但是在几周后它会恢复。SSL握手问题
Java CPU总是100%左右(超过200%),所有其他参数都很好。研究表明,大部分CPU被“HandshakeCompletedNotify-Thread”线程占用。从tcp dump中,我们看到SSL握手需要2-8秒,这非常长,有时会引发超时。
我们的SSL提供商是BSAFE。服务器在Linux(CentOS)上运行,640 mb堆,2个内核。休眠,弹簧使用,Oracle本地分区
什么可能是这种行为的原因?可以做些什么来发现它们?
P.S.我们无法将流量切换到客户的HTTP。
更新:当java进程的传出连接被IP表阻塞时,系统完全释放。在这种情况下释放哪些资源? 我们看到SSL握手频繁卡在“更改密码规格”阶段。客户端(我的java进程)试图重用SSL会话,但服务器是完全无状态的,每次都会产生新的会话。
你可能想看看针对JBoss报告的this issue(不确定这是你正在使用的)。这个问题表明HandshakeCompletedNotify-Thread
可以抛出ConcurrentModificationException
,这是一个竞争条件的可能结果。其他结果包括代码在无限循环中陷入停滞,并挂住一个CPU,这听起来像是你的症状。我会考虑升级JBoss,如果你正在使用它,或者与导致问题报告的库有关。它可能会解决您的问题。
症状看起来与您所描述的类似,但我们使用Tomcat。 – 2011-03-25 10:48:22
您可以尝试切换到JRE默认JSSE实现以查看是否存在BSAFE错误。
启用JSSE调试代码也很有用(javax.net.debug
属性)。
这些链接是非常有益的WRT调试JSSE
http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#Debug
http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/ReadDebug.html
这可能是我们与分析相结合的下一步。感谢提到javax.net。调试属性,它可能会很有用。 – 2011-03-25 10:51:44
你有没有分析过您的DNS查找。当dns查找速度较慢时,SSL握手可能需要更长的时间,这需要查找以及反向查找才能高效。
是的,我们已经考虑过这个问题。 DNS工作正常。谢谢。 – 2011-03-25 10:52:30
这是Sun在6u10推出下一代Java插件时引入的一个已知错误。甲骨文终于在Java 7u2中修复了这个问题,但他们还没有将它移植到Java 6,至少在6月33日。
有关该错误的详细信息#7060523,可以找到here。
你是否用jvisualvm这样的工具来分析应用程序? – Davidann 2011-03-23 16:59:45
向我们的客户(大型银行或公司)解释我们想要描述它们有点困难,但我们正朝着这个方向努力。我们通常使用Yourkit进行分析。 jvisualvm比Yourkit更好吗? – 2011-03-25 10:55:47
你有可以分析的测试系统吗? – Davidann 2011-03-25 15:10:10