xiaoming728

xiaoming728

解决 ClientAbortException: java.io.IOException: Broken pipe

2023-12-11
解决 ClientAbortException: java.io.IOException: Broken pipe

来源:简书- 汤问嗔

链接:https://www.jianshu.com/p/d7f5de27fec5

日期:2020.10.26 21:09:37

做压力测试的时候遇到这个问题,自己并发的经验不够。在并发数量低的情况下没有遇到这个问题。经过网上搜索,参考了别人的思路

我们的服务器前端通过nginx做后端Java的负载均衡。当并发上来之后,nginx不断的和后端的Java服务器建立连接。虽然做了keep-alive配置,却依然挡不住连接的销毁和创建。

通过如下命令对连接状态做了统计

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

发下TIME_WAIT数量非常之高,也就是nginx这台服务器主动断开连接,导致Java后端往断开的套接字上写数据,于是报错。按照参考链接里的说法做了如下优化,下面的内容摘自别人文章。

解决方案很简单,通过修改/etc/sysctl.conf文件,服务器能够快速回收和重用那些TIME_WAIT的资源

#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
net.ipv4.tcp_syncookies = 1
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
net.ipv4.tcp_tw_reuse = 1
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
net.ipv4.tcp_tw_recycle = 1
#表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间
net.ipv4.tcp_fin_timeout=30
生效,如下命令

/sbin/sysctl -p

TIME_WAIT降下来了,也没有报Java异常了,顺利解决。

这边文章算是记录了如何把不同人的解决思路综合,拿来解决自己的问题。参考了别人两篇文章。

参考链接

https://blog.csdn.net/zqz_zqz/article/details/52235479

https://www.cnblogs.com/shengs/p/4495998.html