No buffer space available错误解决方案

 

生产环境,突然爆发问题,网络正常,但是报网络不通错误,重启tomcat立刻好使

开始以为是tomcat的问题,调查了很久,后来加上堆栈日志才发现

简单来说,就是1-4分钟之内,使用了大量的http请求,达到了操作系统限制的最大值,所以许多请求处于wait状态,导致程序错误

原代码,httpClient 未关闭

finally {
            if (is != null) {
                is.close();
            }
            if (postMethod != null) {
                postMethod.releaseConnection();
            }
        }

 

新代码,httpClient正确关闭

finally {
            if (is != null) {
                try{
                is.close();
                }catch(Exception e){
                    
                }
            }
            if(postMethod!=null)
                postMethod.releaseConnection();
            if(httpClient!=null)
                httpClient.getHttpConnectionManager().closeIdleConnections(0);
        }

 

改完这个没好使...[2018/10/18更新]

继续查资料,发现与操作系统有关,此程序所在系统是windowsServer2003 32位

修改注册表

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters

新建 DWORD 类型的注册表项,命名为:MaxUserPort

值数据: 60000(用十进制的格式录入进去,此值的有效范围为5000-65534)

新建 DWORD 类型的注册表项,命名为:TCPTimedWaitDelay

值数据: 30(用十进制的格式录入进去,TIME_WAIT的自动断开时间,默认为4分钟)

HKEY_LOCAL_MACHINE/CurrentControlSet/Services/Tcpip/Parameters下的以下三个参数: 
KeepAliveInterval,设置其值为1000(用十进制的格式录入进去)
KeepAliveTime,设置其值为300000(单位为毫秒,300000代表5分钟) (用十进制的格式录入进去)
TcpMaxDataRetransmissions,设置其值为5(用十进制的格式录入进去)

祝开发顺利!

posted @ 2018-10-11 10:04  删库到跑路  阅读(20733)  评论(0编辑  收藏  举报