- 论坛徽章:
- 0
|
该调的都已经调了(httpd.conf sysctl.conf)
FIN_WAIT_2依然很高
网上找到如下文章
- Freebsd的ipfw会有一些问题,在tcp结束的时候4次握手,server perform active close,那么先向client发个fin,然后进入fin_wait_1状态,等待client发来ack。一旦接受到ack,马上进入 fin_wait_2状态,等待client也发个fin过来,然后ack,然后time_wait.
- 可是问题就来了,假设server进入2状态后client没有进行graceful close,或者client发的fin被某种通道上的东西挡住了,那么server端就会等待下去,等待的时间长短lifetime由tcp的一些参数决定,不同平台不同. 而ipfw默认对创建dynamic rules会发keepalive packets,
- net.inet.ip.fw.dyn_keepalive: 1
- 而对于fin_wait_2,根据参数推测,会等net.inet.ip.fw.dyn_ack_lifetime: 300 秒左右。问题就来了,它在最后20秒又自动keepalive,造成这个状态又自动延续,又会等300秒,似乎永不停歇。。重复重复再重复。。用netstat -an | grep FIN_WAIT 看会有很多。。
- 那么解决问题的根本就在于不要发keepalive
- ipfw diable dyn_keepalive
- 或者
- sysctl -w net.inet.ip.fw.dyn_keepalive=0
复制代码
但是个人感觉net.inet.ip.fw.dyn_keepalive=0对客户端不太好,希望有经验的高手给个好的建议 |
|