痛苦的 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 ...
随机推荐
- 系统目录结构、ls命令、文件类型、alias命令 使用介绍
1周第5次课(3月23日) 课程内容: 2.1/2.2 系统目录结构2.3 ls命令2.4 文件类型2.5 alias命令 Linux系统目录结构 在Linux系统里面也是同样存在很多文件和文件夹,而 ...
- 配置aria2
Mac 用户肯定都受够了百度网盘在自己电脑上的糟糕体验,至少我是如此:安装官方的 App,经常下载时中断,有时甚至 Bug 般连续中断,无奈使用浏览器下载,速度却是令人挠头.花点时间来配置 aria2 ...
- GO富集分析示例【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- 使用react-breadcrumbs-dynamic
这是完全独立于路由器的解决方案,你可以将其与任何版本的React Router(2或3或4)或任何其他用于React的路由库一起使用,或者完全不进行路由.您只需要指定面包屑项目及其道具的组件.然而道具 ...
- HDU1429
Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方.刚开 ...
- 洛谷 SPOJ 题解 SP1 【TEST - Life, the Universe, and Everything】
给出一种主函数递归的方法(其实主函数 main() 也是可以递归的) #include <stdio.h> int main() { int a; scanf("%d" ...
- Spring Cloud第七篇 | 声明式服务调用Feign
本文是Spring Cloud专栏的第七篇文章,了解前六篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cloud ...
- 基于iCamera测试高清摄像头SIV100B(替代ov7670)小结
基于iCamera测试高清摄像头SIV100B(替代ov7670)小结 先看看siv100b主要关键参数 SIV100B与OV7670分辨率和基本特性都差不多,而siv100b,像素尺寸更小,灵敏度更 ...
- redis第一讲【redis的描述,linux和docker下的安装使用】
Redis(REmote DIctionary Server):是什么 redis(远程字典服务器),是完全开源免费的,高性能的k/v分布式内存数据,热门的Nosql数据库 Redis可以干什么: 内 ...
- Web 前端学习大纲
什么是前端? 前端即网站前台部分,也叫前端开发,运行在PC端,移动端等浏览器上展现给用户浏览的网页.随着互联网的发展,HTML5,CSS3,前端框架的应用,跨平台响应式网页设计能够适应各种屏幕分辨率, ...