大量close_wait以及调用ip地址错误获取方法引发的故障
程序员文章站
2022-07-09 13:24:50
...
记录一下这几天帮助兄弟项目组解决的几个问题
工程:网关服务器,业务逻辑少,操作不费时
问题:大量的Close_wait,访问速度较慢
分析&解决:
1、close_wait是TCP/IP协议中被动关闭方收到Fin后没有发送Fin导致
项目采用了mina框架,服务器被动关闭时会生成一个异常,调用exceptionCaught()方法,
在该方法中,服务器调用关闭方法session.close(false);false的意思是先发送数据,等数据 发送完了再关闭。通常情况下这是一个正常的流程,但是在高并发访问的情况下,可能生成大量Close_wait。如果情况允许的话,把false改成true就好了。通常情况下,改成true是没有问题的。
2、项目中获取ip的方法有问题:
此方法会先通过域名服务器获取远程客户段的域名,域名无法获得的情况下再获取ip,在域名服务器不稳定的情况下,通常耗时好几百毫秒。如果没有必要的话,可以将这个代码直接修改为:
工程:网关服务器,业务逻辑少,操作不费时
问题:大量的Close_wait,访问速度较慢
分析&解决:
1、close_wait是TCP/IP协议中被动关闭方收到Fin后没有发送Fin导致
项目采用了mina框架,服务器被动关闭时会生成一个异常,调用exceptionCaught()方法,
在该方法中,服务器调用关闭方法session.close(false);false的意思是先发送数据,等数据 发送完了再关闭。通常情况下这是一个正常的流程,但是在高并发访问的情况下,可能生成大量Close_wait。如果情况允许的话,把false改成true就好了。通常情况下,改成true是没有问题的。
2、项目中获取ip的方法有问题:
ip = ((InetSocketAddress)(session.getRemoteAddress())).getHostName();
此方法会先通过域名服务器获取远程客户段的域名,域名无法获得的情况下再获取ip,在域名服务器不稳定的情况下,通常耗时好几百毫秒。如果没有必要的话,可以将这个代码直接修改为:
InetSocketAddress accountAddress = (InetSocketAddress) session .getRemoteAddress(); String accountIp = accountAddress.getAddress().getHostAddress();