出现这种原因,一般是服务器端承受不起这么多并发访问,或客户端异常断开,或解压时出现异常
只需要重载 以下方法在处理异常时,关闭掉客户端连接就可以。
/**
* 处理异常
* @param session
* @param cause
* @throws Exception
*/
@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
if (cause instanceof IOException) {
logger.info("处理请求出现IO异常 " + session, cause);
session.close();
}
else if (cause instanceof ProtocolDecoderException) {
logger.warn("出现编码与解码异常:" + session, cause);
session.close();
}
else {
logger.error("出现其它异常:" + session, cause);
session.close();
}
}
可以用
netstat -na|grep 9090|grep FIN_WAIT2|wc -l
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
这两命令查看网络情况。
通过设置 linux 内核 参数,优化网络情况
解决方案:
为 FIN_WAIT2 增加超时机制
CLOSE_WAIT缩短keepAlive时间
修改linux系统内核参数:
vi /etc/sysctl.conf
net.ipv4.tcp_keepalive_time = 20
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_keepalive_intvl = 2
net.ipv4.tcp_fin_timeout = 20
设置fin的连接超时时间为20s