2011-03-23 209 views
5

我们的服务器应用程序在某些客户中的速度极慢。缓慢通过服务器重新启动来解决,但是在几周后它会恢复。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会话,但服务器是完全无状态的,每次都会产生新的会话。

+0

你是否用jvisualvm这样的工具来分析应用程序? – Davidann 2011-03-23 16:59:45

+0

向我们的客户(大型银行或公司)解释我们想要描述它们有点困难,但我们正朝着这个方向努力。我们通常使用Yourkit进行分析。 jvisualvm比Yourkit更好吗? – 2011-03-25 10:55:47

+0

你有可以分析的测试系统吗? – Davidann 2011-03-25 15:10:10

回答

1

你可能想看看针对JBoss报告的this issue(不确定这是你正在使用的)。这个问题表明HandshakeCompletedNotify-Thread可以抛出ConcurrentModificationException,这是一个竞争条件的可能结果。其他结果包括代码在无限循环中陷入停滞,并挂住一个CPU,这听起来像是你的症状。我会考虑升级JBoss,如果你正在使用它,或者与导致问题报告的库有关。它可能会解决您的问题。

+0

症状看起来与您所描述的类似,但我们使用Tomcat。 – 2011-03-25 10:48:22

0

您可以尝试切换到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

+0

这可能是我们与分析相结合的下一步。感谢提到javax.net。调试属性,它可能会很有用。 – 2011-03-25 10:51:44

0

你有没有分析过您的DNS查找。当dns查找速度较慢时,SSL握手可能需要更长的时间,这需要查找以及反向查找才能高效。

+0

是的,我们已经考虑过这个问题。 DNS工作正常。谢谢。 – 2011-03-25 10:52:30

3

这是Sun在6u10推出下一代Java插件时引入的一个已知错误。甲骨文终于在Java 7u2中修复了这个问题,但他们还没有将它移植到Java 6,至少在6月33日。

有关该错误的详细信息#7060523,可以找到here