adb Connection reset by peer的解决方法

本文同步发于:https://www.cnblogs.com/yeshen-org/p/18350232

最近在编译一个老项目,项目中依赖了很多第三方库,用gradle编译要20-30分钟,而且内存开销很大。
公司配的15G内存的电脑,一次编译能用到14G。
编译的时候,ubuntu有概率会卡死(卡死的问题,网上的方法我尝试了一轮,但是没有用,物理重启电脑有效)。
此为背景。昨晚重启之后,我发现adb用不了了。报错如下:

adb devices
adb shell
error: protocol fault (couldn't read status): Connection reset by peer

adb start-server
adb: failed to check server version: protocol fault (couldn't read status): Connection reset by peer

最后的解决办法

https://forums.linuxmint.com/viewtopic.php?t=415486

step 0

mv ~/.android ~/Download

step 1 diable mDNS for wireless debugging

In Android Studio: Open File / Settings
Go to: Settings / Build, Execution, Deployment / Debugger
In Section "Android Debug Bridge (abd)":
Uncheck "Enable adb mDNS for wireless debugging"

step 2

Restart Android Studio.

step 3

restart the computer.

step 4

adb kill-server
adb server -a

排查过程

排查是否端口占用

adb nodaemon start-server
netstat -tuln | grep 5353

把占用5353端口的udp都给去掉.

export ADB_TRACE=all

wget http://dl-ssl.google.com/android/repository/platform-tools_r30.0.4-linux.zip
./adb start-server

netstat -tuln | grep 5037

把占用5037端口的tcp都给去掉.

重启电脑试图恢复

回家冷静一下

按 start-server 的日志看有没有人遇到类似的问题

adb D 08-09 09:08:44 64447 64447 adb_trace.cpp:187] Android Debug Bridge version 1.0.41
adb D 08-09 09:08:44 64447 64447 adb_trace.cpp:187] Version 30.0.4-6686687
adb D 08-09 09:08:44 64447 64447 adb_trace.cpp:187] Installed as /home/apk/platform-tools_r30.0.4-linux/platform-tools/adb
adb D 08-09 09:08:44 64447 64447 adb_trace.cpp:187]
adb D 08-09 09:08:44 64447 64447 adb_client.cpp:346] adb_connect: service: host:start-server
adb D 08-09 09:08:44 64447 64447 adb_client.cpp:155] _adb_connect: host:version
adb D 08-09 09:08:44 64447 64447 adb_io.cpp:107] writex: fd=3 len=16 30303063686f73743a76657273696f6e 000chost:version
adb D 08-09 09:08:44 64447 64447 adb_io.cpp:81] readx: fd=3 wanted=4
adb D 08-09 09:08:44 64447 64447 adb_io.cpp:88] readx: fd=3 error 104: Connection reset by peer

https://forums.linuxmint.com/viewtopic.php?t=415486

20240827更新

发现更换电脑了之后,还是会这样。

adb devices
adb: failed to check server version: protocol fault (couldn't read status): Connection reset by peer

./gradlew assembleDebug

FAILURE: Build failed with an exception.

* What went wrong:
Unable to find a usable idle daemon. I have connected to 100 different daemons but I could not use any of them to run the build. BuildActionParameters were DefaultBuildActionParameters{, currentDir=/home/yisheng/ssd/netease/cloud-gaming-sdk/CloudGame, systemProperties size=54, envVariables size=67, logLevel=LIFECYCLE, useDaemon=true, continuous=false, injectedPluginClasspath=[]}.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

解决方法一:可以看看 /usr/bin/qzhddr 这个路径有没有软件,卸载下。
解决方法二:看下iptable,处理下iptable的配置(未验证)
解决方法三:找安全组同事处理下…

### Connection reset 报错的原因 `Connection reset` 是一种常见的网络异常现象,通常表示一方主动关闭了连接或者由于某种原因导致通信中断。以下是可能引发 `Connection reset` 的主要原因: 1. **TCP 连接状态不一致** 当客户端尝试通过已失效的 TCP 连接发送数据时,如果服务器端已经关闭此连接,则会触发 `Connection reset` 错误[^2]。 2. **负载均衡器的影响** 如果应用部署在带有负载均衡器的环境中,当负载均衡器删除或标记某个连接为不再活跃时,而服务器仍认为该连接有效,就会发生此类错误。 3. **防火墙或 NAT 超时设置** 防火墙或 NAT 设备可能会强制终止长时间未活动的连接,从而导致客户端收到 `Connection reset` 错误[^1]。 4. **系统资源限制** 系统配置中的某些参数(如最大动态端口数、TCP 等待延迟时间和最大连接数)可能导致连接被意外重置[^3]。 --- ### 解决方案 针对上述原因,可以采取以下措施来减少或消除 `Connection reset` 报错的发生: #### 1. 出现错误后的重试机制 实现自动化的重试逻辑可以帮助恢复因短暂网络波动而导致失败的操作。例如,在 HTTP 请求中加入指数退避算法以逐步增加重试间隔时间。 #### 2. 使用 TCP 长连接 对于频繁交互的应用场景,建议采用 TCP 长连接方式代替短连接模式。这能够显著降低重新建立连接所带来的额外开销以及潜在的风险因素。 ```python import socket def create_long_connection(host, port): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((host, port)) return sock ``` #### 3. 启用并调整 TCP Keepalive 参数 启用 TCP Keepalive 功能可以让操作系统定期向远端发送探测包,确认对方是否仍然在线。同时可以根据实际需求修改默认超时值和其他相关选项。 ```bash # Linux 下设置全局 TCP Keepalive 参数 echo 60 > /proc/sys/net/ipv4/tcp_keepalive_time # 初始探针发出前的时间 (秒) echo 5 > /proc/sys/net/ipv4/tcp_keepalive_intvl # 探针之间的间隔时间 (秒) echo 3 > /proc/sys/net/ipv4/tcp_keepalive_probes # 尝试次数 ``` #### 4. 修改系统级网络参数 适当优化操作系统的网络栈配置有助于缓解部分由资源耗尽引起的连接问题。具体可参考以下几个关键变量及其推荐范围: - **MaxUserPort**: 增加可用端口号上限至接近理论极限值。 - **TcpTimedWaitDelay**: 缩短 TIME_WAIT 状态持续周期以释放更多闲置端口。 - **TcpNumConnections**: 提高单机支持的最大并发连接数量。 > 注意:以上改动需谨慎执行,并充分测试其对整体性能的影响。 --- ### 总结 通过对 `Connection reset` 的成因分析可知,它往往源于双方在网络层面上未能达成同步共识所致。因此,无论是改进应用程序设计还是调优底层基础设施都至关重要。结合实际情况灵活运用前述方法即可有效应对这一挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值