发新话题
打印

[apache] 压力测试完10个小时后apache的CLOSE_WAIT状态连接还有很多

压力测试完10个小时后apache的CLOSE_WAIT状态连接还有很多

昨晚对服务器做过一次压力测试, 每次测试均是由80端口监听的resin接受连接后又连接本地的apache的8080端口, 最后返回, 测试完成时, 80端口连接数达3100多个, 其中大部分为TIME_WAIT状态;  8080端口连接有1300多个, FIN_WAIT1/2, TIME_WAIT, CLOSE_WAIT 数目相差不大.

早上过来一看, resin的80端口连接已完全释放, 但apache的8080端口CLOSE_WAIT状态的连接仍大部保留, 其它状态的已释放, 且没有正在释放的迹象.

是不是apache哪里需要改下配置呢?
欲知前世因,今生受者是。
欲知来世果,今生作者是。

TOP

一般来说,在一次正常的HTTP连接结束时,按正常的次序应该是服务器先发出FIN信号,客户端确认,然后客户端再发出FIN信号,服务端确认。如果客户端因为某种原因先于服务端发出了FIN信号,就会导致服务端被动关闭。

通过下列Linux内核参数来解决问题:

sysctl -w net.ipv4.tcp_keepalive_time=30
sysctl -w net.ipv4.tcp_keepalive_probes=2
sysctl -w net.ipv4.tcp_keepalive_intvl=2

注意:Linux的内核参数调整的可能有些猛,到底合不合适要注意观察。

TOP

多谢, 是不是客户端程序代码也有些问题呢?
欲知前世因,今生受者是。
欲知来世果,今生作者是。

TOP

客户端一般都是浏览器IE、firefox之类
都是一样问题不是很大

TOP

呵呵, 在我们系统里客户端是本机上的resin, 使用了httpclient连接apache.
欲知前世因,今生受者是。
欲知来世果,今生作者是。

TOP

问题终于解决了,  原来不是apache的问题, 是resin上的程序使用了httpclient做为客户端搞的.

netstat -antp的时候, 发现8080端口的CLOSE_WAIT连接都是属于进程java的, 重启resin就释放.

解决办法:  在调用httpclient时加入一行:
   httpmethod.setRequestHeader("Connection", "close");
让这个socket在请求完毕后就关闭.
欲知前世因,今生受者是。
欲知来世果,今生作者是。

TOP


原来是这样子

TOP

resin VS tomcat, which one is better?
春有百花秋有月,夏有凉风冬有雪,若无闲事挂心头,便是人间好时节!

TOP

感觉是resin的启动速度比较快,人性化方面也做得不错,号称性能比tomcat高4,5倍的样子
tomcat启动时候貌似比resin慢一些性能,不过他是按照标准来开发,resin包含一些自己的专有属性

TOP

支持楼主,解决问题后能够和大家分享!
Linuxpk -- 全球最大中文开源门户

TOP

发新话题