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


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

    • 参考:https://www.jianshu.com/p/d7f5de27fec5
    • 参考:https://blog.csdn.net/zqz_zqz/article/details/52235479
    • 参考:https://www.cnblogs.com/shengs/p/4495998.html

    #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]}'
    
    • 1

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

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

    1、修改配置

    vim /etc/sysctl.conf
    
    • 1

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3、生效命令

    /sbin/sysctl -p
    
    • 1

    4、最终结果

    TIME_WAIT 降低到正常范围(100以下),java进程也没报错了

  • 相关阅读:
    C++结构体定义 & 创建 & 赋值 & 结构体数组
    【无标题】
    Nginx +tomcat的集群概念
    VauditDemo靶场代码审计
    Greenplum-数据导入导出
    【TES745D】青翼自研基于复旦微的FMQL45T900全国产化ARM核心模块(100%国产化)
    js基础语法和代码示例(11-20)
    使用词袋模型(BoW)测试提取图像的特征点和聚类中心
    学校项目培训之Carla仿真平台之安装Carla
    FAT12文件系统详解
  • 原文地址:https://blog.csdn.net/qq_24298751/article/details/126023324