痛苦的 java.net.BindException: Address already in use: connect —— Nacos的坑
我的dubbo应用, 刚开始的时候,启动一两个是没有问题的, 启动多了就大量出现:
-- ::24.869 ERROR --- [TaskScheduler-] o.s.c.a.nacos.discovery.NacosWatch : Error watching Nacos Service change java.lang.IllegalStateException: failed to req API:/nacos/v1/ns/service/list after all servers([192.168.11.196:]) tried: failed to req API:http://192.168.11.196:8848/nacos/v1/ns/service/list. code:500 msg: java.net.BindException: Address already in use: connect
at com.alibaba.nacos.client.naming.net.NamingProxy.reqAPI(NamingProxy.java:) ~[nacos-client-1.0..jar:na]
at com.alibaba.nacos.client.naming.net.NamingProxy.reqAPI(NamingProxy.java:) ~[nacos-client-1.0..jar:na]
at com.alibaba.nacos.client.naming.net.NamingProxy.reqAPI(NamingProxy.java:) ~[nacos-client-1.0..jar:na]
at com.alibaba.nacos.client.naming.net.NamingProxy.getServiceList(NamingProxy.java:) ~[nacos-client-1.0..jar:na]
at com.alibaba.nacos.client.naming.net.NamingProxy.getServiceList(NamingProxy.java:) ~[nacos-client-1.0..jar:na]
at com.alibaba.nacos.client.naming.NacosNamingService.getServicesOfServer(NacosNamingService.java:) ~[nacos-client-1.0..jar:na]
at org.springframework.cloud.alibaba.nacos.discovery.NacosWatch.nacosServicesWatch(NacosWatch.java:) ~[spring-cloud-alibaba-nacos-discovery-0.9..RELEASE.jar:0.9..RELEASE]
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:) ~[spring-context-5.1..RELEASE.jar:5.1..RELEASE]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:) ~[na:1.8.0_201]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:) ~[na:1.8.0_201]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$(ScheduledThreadPoolExecutor.java:) ~[na:1.8.0_201]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:) ~[na:1.8.0_201]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:) ~[na:1.8.0_201]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:) ~[na:1.8.0_201]
at java.lang.Thread.run(Thread.java:) ~[na:1.8.0_201]
可以看到 NamingProxy 的reqAPI 方法返回了错误。
根本原因是:
public String callServer(String api, Map<String, String> params, String curServer, String method) throws NacosException {
long start = System.currentTimeMillis();
long end = 0L;
this.checkSignature(params);
List<String> headers = this.builderHeaders();
if (!curServer.contains(":")) {
curServer = curServer + ":" + this.serverPort;
} String url = HttpClient.getPrefix() + curServer + api;
HttpResult result = HttpClient.request(url, headers, params, "UTF-8", method); // 这里
end = System.currentTimeMillis();
MetricsMonitor.getNamingRequestMonitor(method, url, String.valueOf(result.code)).observe((double)(end - start));
if ( == result.code) {
return result.content;
} else if ( == result.code) {
return "";
} else {
throw new NacosException(, "failed to req API:" + HttpClient.getPrefix() + curServer + api + ". code:" + result.code + " msg: " + result.content); // 这里!!
}
}
再进去
public static HttpClient.HttpResult request(String url, List<String> headers, Map<String, String> paramValues, String encoding, String method) {
HttpURLConnection conn = null; HttpClient.HttpResult var7;
try {
String encodedContent = encodingParams(paramValues, encoding);
url = url + (StringUtils.isEmpty(encodedContent) ? "" : "?" + encodedContent);
conn = (HttpURLConnection)(new URL(url)).openConnection();
setHeaders(conn, headers, encoding);
conn.setConnectTimeout(CON_TIME_OUT_MILLIS);
conn.setReadTimeout(TIME_OUT_MILLIS);
conn.setRequestMethod(method);
conn.setDoOutput(true);
if ("POST".equals(method) || "PUT".equals(method)) {
byte[] b = encodedContent.getBytes();
conn.setRequestProperty("Content-Length", String.valueOf(b.length));
conn.getOutputStream().write(b, , b.length);
conn.getOutputStream().flush();
conn.getOutputStream().close();
} conn.connect();// 发生错误的时候,执行达到这里, 就到了下面的 catch部分。
LogUtils.NAMING_LOGGER.debug("Request from server: " + url);
var7 = getResult(conn);
return var7;
} catch (Exception var13) {
try {
if (conn != null) {
LogUtils.NAMING_LOGGER.warn("failed to request " + conn.getURL() + " from " + InetAddress.getByName(conn.getURL().getHost()).getHostAddress());
}
} catch (Exception var12) {
LogUtils.NAMING_LOGGER.error("[NA] failed to request ", var12);
} LogUtils.NAMING_LOGGER.error("[NA] failed to request ", var13);
var7 = new HttpClient.HttpResult(, var13.toString(), Collections.emptyMap());
} finally {
if (conn != null) {
conn.disconnect();
} } return var7;
}
开始的时候,总是以为是服务端出了什么问题, 应该就是 httpclient 发送GET 请求, 服务端没有正确响应吧! 于是反复折腾 nacos服务端,还跟进去了其源码。 后面发现搞错了方向!
反复折腾,无果。 慢慢的发现, 发生Address already in use: connect错误,也不是有规律的,有时候启动一个应用出错,有时候不会,有时候需要启动很多个才会。 而且出现这个错误的概率也是不一样的,有时候一个应用10分钟 出现 1-2个,有的10分钟几十个。
网上搜索一把Address already in use: connect,发现都是 junit相关的错误,明显跟我这个不同(后面才知道, 其实错误的原因是一样的!)。 后面慢慢认识到, com.alibaba.nacos.client.naming.net.HttpClient#request 创建HttpURLConnection 没有使用连接处, 这样的问题我之前也遇到过。 如果过多的HttpURLConnection, 可能会导致系统资源不够用。调试发现 nacos 似乎以非常快的速度调用com.alibaba.nacos.client.naming.net.NamingProxy#callServer(java.lang.String, java.util.Map<java.lang.String,java.lang.String>, java.lang.String, java.lang.String) 方法 。netstat查看服务器,发现大量的
tcp6 0 0 192.168.11.196:49632 192.168.11.196:8848 TIME_WAIT
netstat -na | grep TIME_WAIT | wc -l 返回 28028 , 这肯定是不对的! 太恐怖了有没有!
[root@localhost logs]# ulimit -a
core file size (blocks, -c)
data seg size (kbytes, -d) unlimited
scheduling priority (-e)
file size (blocks, -f) unlimited
pending signals (-i)
max locked memory (kbytes, -l)
max memory size (kbytes, -m) unlimited
open files (-n)
pipe size ( bytes, -p)
POSIX message queues (bytes, -q)
real-time priority (-r)
stack size (kbytes, -s)
cpu time (seconds, -t) unlimited
max user processes (-u)
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
修改 ulimit -n 为65535 , 无果。 -n 是用来修改 可打开文件数的,可能不是修改端口数的吧。 搞半天无果。
忽然意识到本机可能也端口不够用, 果然, netstat查看了一些本机的 端口,发现大量的 端口未释放,15000 以上的量!
原来不是 nacos 的坑! 而是 我这个客户端的问题, 我本机(win10)的临时端口不够用了!! 难怪nacos的日志找不到错误,我本机就 有,原来请求都没有发送过去!!
linux 默认是可以打开很多端口的,win不是。
据说win 是 1024 -5000, 后面发现这个不对! 那个是之前的win系统,我的win10 不是这样的,而是:
修改本机
netsh int ipv4 set dynamicport tcp start=20000 num=40000
确定。
netsh int ipv4 show dynamicport tcp 协议 tcp 动态端口范围
---------------------------------
启动端口 :
端口数 :
搞定!
不过,确实跟nacos 有关, 这货需要打开这么多的端口??? nacos 的坑啊!
wiindows 上容易出现这个问题, linux 一般是不会的:
[root@localhost nacos]# sysctl -a | grep file-max
fs.file-max =
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
sysctl: reading key "net.ipv6.conf.p4p1.stable_secret"
[root@localhost nacos]#
[root@localhost nacos]# sysctl -a | grep ipv4.ip_local_port_range
net.ipv4.ip_local_port_range =
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
sysctl: reading key "net.ipv6.conf.p4p1.stable_secret"
[root@localhost nacos]# ulimit -u [root@localhost nacos]# netstat -an | wc -l
参考
痛苦的 java.net.BindException: Address already in use: connect —— Nacos的坑的更多相关文章
- JMETER压力测试报错:JAVA.NET.BINDEXCEPTION: ADDRESS ALREADY IN USE: CONNECT
最近在实现接口压力测试的时候遇到这样的一个问题 当线程数持续上升到一个点的时候,运行脚本的时候有很多报错,如图: java.net.BindException: Address already in ...
- Jmeter接口压力测试,Java.net.BindException: Address already in use: connect
Java.net.BindException: Address already in use: connect 问题原因: 操作系统会为TCP/IP服务预留临时端口,Jmeter在跑并发测试的时候每开 ...
- JMeter压测“java.net.BindException: Address already in use: connect”解决方法
之前在windows机上用JMeter压测,50并发下出现大量接口报“java.net.BindException: Address already in use: connect”错误. 从字面的意 ...
- JMeter Exception: java.net.BindException: Address already in use: connect(转)
转自:http://twit88.com/blog/2008/07/28/jmeter-exception-javanetbindexception-address-already-in-use-co ...
- jmeter压力测试报错:java.net.BindException: Address already in use: connect || java.net.SocketException: Socket closed
windows提供给TCP/IP链接的端口为 1024-5000,并且要四分钟来循环回收它们,就导致我们在短时间内跑大量的请求时将端口占满了,导致如上报错. 解决办法(在jmeter所在服务器操作): ...
- JMeter java.net.BindException: Address already in use: connect
原文:https://blog.csdn.net/macwhirr123/article/details/77199057 出现原因:TCP/IP连接数不够或TIME_WAIT中存在很多链接,导致吞吐 ...
- jmeter 运行脚本报错 java.net.BindException: Address already in use
在win下跑jmeter时,在聚合报告中出现错误.打开日志文件(前提是将日志写入了指定文件) 发现报错的原因为:java.net.BindException: Address already in u ...
- Jenkins启动时报错:java.net.BindException: Address already in use: bind 解决方法
下载jenkins.war包后,进入Jenkins.war包目录下,运行java -jar jenkins.war时报端口被占用的错误:java.net.BindException: Address ...
- java.net.BindException: address already in use <null>:xxxx
linux下,tomcat突然关闭了,执行关闭(shutdown.sh)和启动(startup.sh)成功后,tomcat仍未运行,查看tomcat的catalina日志发现这样一个报错:java.n ...
随机推荐
- php 设置临时内存和超时设置脚本最大执行时间
ini_set('memory_limit','3072M'); // 临时设置最大内存占用为3G set_time_limit(0); // 设置脚本最大执行时间 为0 永不过期
- 一条数据的HBase之旅,简明HBase入门教程2:数据模型
[摘要] 上一篇文章讲了HBase项目与应用概况信息,这篇文章讲述HBase的数据模型以及一些基础概念,数据模型可以说决定了HBase适合于什么应用场景. 华为云上的NoSQL数据库服务CloudTa ...
- 转:MySQL下载安装、配置与使用(win7x64)
1 第一大步:下载. a.俗话说:“巧妇难为无米之炊”嘛!我这里用的是 ZIP Archive 版的,win7 64位的机器支持这个,所以我建议都用这个.因为这个简单嘛,而且还干净. 地址见图 拉倒最 ...
- 用C在GBA上写光线追踪(0)配置开发编译环境
前段时间用C#写了一个光线追踪程序,可以渲染圆球,平面这种基本图形,反射,光照,阴影,都大致尝试做了一下. ↑ C#实现的光线追踪 ↑ GBA上C实现的光线追踪 然而,在我打算继续深入优化的时 ...
- Chrome快捷键吐血整理
Chrom是平时开发过程中最常用到的浏览器,使用快捷键操作Chrome能提高我们的使用效率,而且可以脱离鼠标进行操作.本篇博客就对平时我们常用的Chrome快捷键做一个整理总结.大家拿走不谢,哈哈~~ ...
- openlayers4 入门开发系列结合 echarts4 实现散点图(附源码下载)
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...
- LightOJ1284 Lights inside 3D Grid (概率DP)
You are given a 3D grid, which has dimensions X, Y and Z. Each of the X x Y x Z cells contains a lig ...
- BZOJ3110[Zjoi2013]K大数查询(树状数组+整体二分)
3110 [Zjoi2013]K大数查询 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a ...
- JSP+Servlet 实现:理财产品信息管理系统
一.接业务,作分析 1.大致业务要求 1.1 使用 JSP+Servlet 实现理财产品信息管理系统,MySQL5.5 作为后台数据库,实现查看理财 和增加理财功能 1.2 查询页面效果图 1.3 添 ...
- USB3.0 图像视频传输 开发 CYUSB3014开发基础(导入官方例程) 转
CYPREE提供的FX3_SDK开发包里面有很多基础的内容,除了前面提到的几个pdf文件外,还有三个文件夹,是官方提供的基础例程.学习CYUSB3014应该就从这里开始,从这几个例程开始.例程共有三个 ...