#1、说明
报错:org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe
做压力测试的时候遇到这个问题,自己并发的经验不够。在并发数量低的情况下没有遇到这个问题。经过网上搜索,参考了别人的思路
我们的服务器前端通过nginx做后端Java的负载均衡。当并发上来之后,nginx不断的和后端的Java服务器建立连接。虽然做了keep-alive配置,却依然挡不住连接的销毁和创建。
#2、查看超时情况
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
发现TIME_WAIT
数量非常之高,也就是nginx这台服务器主动断开连接,导致Java后端往断开的套接字上写数据,于是报错。按照参考链接里的说法做了如下优化,下面的内容摘自别人文章。
#3、解决方案
解决方案很简单,通过修改nginx所在服务器的/etc/sysctl.conf文件,
服务器能够快速回收和重用那些TIME_WAIT的资源
1、修改配置
vim /etc/sysctl.conf
2、配置内容
#表示开启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
3、生效命令
/sbin/sysctl -p
TIME_WAIT
降低到正常范围(100以下),java进程也没报错了