2024年4月12日发(作者:)
问题描述
在tomcat上,压力测试(并行50,串行100,即5000次)的JAVA程序B44。
压测完毕后(压测试程序已执行完,tomcat也没有任何程序再跑)tomcat就假死了(访
问tomcat没反应,无法显示该页)。
然后,再过两分钟,tomcat又能正常访问了。一切自动恢复正常。
分析问题
先后进行了多次测试,发现以下问题:
与写日志的线程无关。因为,改成了线程池也结果相同。
与写日志无关。因为,不写日志也结果相同。
与程序无关,我写了个最简单的JSP,压测也是这样。
与程序的运行时间有关,如果这个程序要运行好几百毫秒(如:M04),反而不会
假死。
如果,用APACHE分发到多个TOMCAT,则会产生APACHE假死,而TOMCAT不会
假死。
如果有硬件负载均衡器分发到多个TOMCAT。估计也会产生与APACHE分发,相同
的结果。
与运行的web server无关。因为,在weblogic上运行也结果相同。
与内存无关,因为压测的过程中,内存变化不大。
与机器性能无关,先后在多次性能不同的机器上进行了测试,效果都相同。
与web server分配的堆栈大小无关,改大后反而报内存不足。
最后,发现非常关键的一点假死时,除了用IE访问地址报“无法打开该网页”外,
压测的程序都抛出同一例外信息“ception: Address already in use:
connect”。
最终,得出大概原因是短时间内new socket操作很多,而()操作并不能
立即释放绑定的端口,而是把端口设置为TIME_WAIT状态,过段时间(默认240s)才释
放,(用netstat -na看到有好几千行被调用的端口为TIME_WAIT),最后系统资源耗尽
(windows上是耗尽了pool of ephemeral ports ,这段区间在1024-5000之间; )
解决办法
1) 调高web服务器的最大连接线程数,即打开tomcat的文件,设置
Connector的以下参数:minProcessors="70" maxProcessors="2000"
acceptCount="2000"
2) 修改运行web服务器的机器的操作系统网络配置,即在注册表
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters中增加
以下两个DWORD参数:
MaxUserPort=fffe
TcpTimedWaitDelay=1e
最后,重新启动计算机。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1712918966a2147917.html
评论列表(0条)