我们的服务器应用程序在某些客户中极度缓慢。服务器重启会解决缓慢问题,但几周后它会恢复。
Java CPU总是大约100%(200%),所有其他参数都很好。研究表明,大多数CPU都被“HandshakeCompletedNotify-Thread”线程所消耗。从tcp dump我们看到SSL握手需要2-8秒,这很长,有时会抛出超时。
我们的SSL提供商是BSAFE。服务器在Linux(CentOS)上运行,640 MB堆,2个核心。使用Hibernate,spring,Oracle local db
这种行为可能是什么原因?找到它们可以做些什么?
P.S。我们无法在客户处将流量切换为HTTP。
更新:当使用IP表阻止java进程的传出连接时,系统完全释放。在这种情况下释放了什么资源? 我们看到SSL Handshake经常陷入“改变密码规范”阶段。客户端(我的java进程)尝试重用SSL会话,但服务器完全无状态,每次都会生成新的会话。
答案 0 :(得分:3)
这是Sun在6u10推出下一代Java插件时引入的已知错误。 Oracle最终在Java 7u2中修复了它,但他们还没有将它向后移植到Java 6,至少从6u33开始。
可以找到有关错误#7060523的详细信息{。{3}}。
答案 1 :(得分:1)
你可能想看一下针对JBoss报告的this issue(不确定你是否正在使用它)。这些问题表明HandshakeCompletedNotify-Thread
可以抛出ConcurrentModificationException
,这是竞争条件的一种可能结果。其他结果包括卡在无限循环中的代码并固定CPU,这听起来像你的症状。如果您正在使用它,或者与导致报告问题相关的库,我会考虑升级JBoss。它可能会解决您的问题。
答案 2 :(得分:0)
您可以尝试切换到JRE默认的JSSE实现,以查看是否存在BSAFE错误。
启用JSSE调试代码也很有价值(javax.net.debug
属性)。
这些链接非常有用,可以调试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
答案 3 :(得分:0)
您是否分析过DNS查询。当dns查找速度慢时,SSL握手可能需要更长时间,它需要查找以及反向查找才能有效。