`

java.io.IOException 断开的管道 解决方法 ClientAbortException: java.io.IOException: Broken

    博客分类:
  • java
阅读更多

今天公司技术支持的童鞋报告一个客户的服务不工作了,紧急求助,于是远程登陆上服务器排查问题。

    查看采集数据的tomcat日志,习惯性的先翻到日志的最后去查看有没有异常的打印,果然发现了好几种异常信息,但是最多还是这个:

[java] view plain copy
 
  1. 24-Nov-2016 09:54:21.116 SEVERE [http-nio-8081-Acceptor-0] org.apache.tomcat.util.net.NioEndpoint$Acceptor.run Socket accept failed  
  2.  java.io.IOException: Too many open files  
  3.     at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)  
  4.     at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:241)  
  5.     at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:688)  
  6.     at java.lang.Thread.run(Thread.java:745)  

    “Too manay open files” 问题很明显啊,文件描述符超出限制导致无法打开文件或创建网络连接,这个问题又会导致一些其它问题的产生,肯定是ulimit没有优化,于是检查ulimit的设置;

[plain] view plain copy
 
  1. [root@sdfassd logs]# ulimit -a  
  2. core file size          (blocks, -c) 0  
  3. data seg size           (kbytes, -d) unlimited  
  4. scheduling priority             (-e) 0  
  5. file size               (blocks, -f) unlimited  
  6. pending signals                 (-i) 62819  
  7. max locked memory       (kbytes, -l) 64  
  8. max memory size         (kbytes, -m) unlimited  
  9. open files                      (-n) 65535  
  10. pipe size            (512 bytes, -p) 8  
  11. POSIX message queues     (bytes, -q) 819200  
  12. real-time priority              (-r) 0  
  13. stack size              (kbytes, -s) 10240  
  14. cpu time               (seconds, -t) unlimited  
  15. max user processes              (-u) 62819  
  16. virtual memory          (kbytes, -v) unlimited  
  17. file locks                      (-x) unlimited  

 

     open files竟然是65535,已经做过了优化,是不是先启动的tomcat等服务,然后才对ulimit做的优化?有可能,这样的话重启一下服务就ok了,于是将全部服务重启了一遍,果然运行正常了,不一会报表就显示数据了,然后告诉技术支持,问题已经解决了,然后就去处理别的case了;

    结果还不到20分钟,技术支持说,报表又没有数据了,于是又打数据采集的应用的tomcat日志查看,发现了一堆异常,全都是一个错:

[java] view plain copy
 
  1. 24-Nov-2016 09:54:24.574 WARNING [http-nio-18088-exec-699] org.apache.catalina.core.StandardHostValve.throwable Exception Processing ErrorPage[exceptionType=java.lang.Throwable, location=/views/error/500.jsp]  
  2.  org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe  
  3.     at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:393)  
  4.     at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:426)  
  5.     at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:342)  
  6.     at org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:295)  
  7.     at org.apache.catalina.connector.Response.finishResponse(Response.java:453)  
  8.     at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:378)  
  9.     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)  
  10.     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)  
  11.     at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)  
  12.     at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)  
  13.     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)  
  14.     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)  
  15.     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085)  
  16.     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)  
  17.     at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)  
  18.     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1556)  
  19.     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1513)  
  20.     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)  
  21.     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)  
  22.     at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)  
  23.     at java.lang.Thread.run(Thread.java:745)  


    这个异常非常多,看报错信息,是tomcat的connector在执行写操作的时候发生了Broken pipe异常,connector是tomcat处理网络请求的,难道是网络出问题了,但是为什么发生异常的都是写,读就没问题呢?为了判断是不是网络问题,于是用wget命令访问了一下服务器的一个接口,结果发现等了好久都没有响应,正常情况下应该是马上就有响应的,这说明不是网络的原因,是服务器的问题,又用命令查看了下当前tcpip连接的状态:

[plain] view plain copy
 
  1. [root@sdfassd logs]# netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'  
  2. CLOSE_WAIT        3853  
  3. TIME_WAIT         40  
  4. ESTABLISHED       285  
  5. LAST_ACT          6  


    CLOSE_WAIT 状态的连接竟然有3853个,这太不正常了,这说明是客户端先关闭了连接,服务器端没有执行关闭连接的操作,导致服务器端一直维持在CLOSE_WAIT的状态,如果不对操作系统的keepalive做优化,这个状态默认会维持两个小时,查看了下系统的设置:

[plain] view plain copy
 
  1. [root@sdfassd logs]# sysctl -a |grep keepalive  
  2. net.ipv4.tcp_keepalive_time = 7200  
  3. net.ipv4.tcp_keepalive_probes = 9  
  4. net.ipv4.tcp_keepalive_intvl = 75  

    果然是7200秒,这就解释通了,为什么第一次查看tomcat日志最后报错都是“Too manay open files”异常,一定是在两个小时内,close_wait状态暴增,导致文件描述符超过了65535的最大限制;

    而这个状态应该就是broken pipe 异常导致的,是什么导致的broken pipe异常呢?为什么探针关闭了连接,但是数据采集服务器却没有关闭连接?报异常的是tomcat的connector,tomcat不可能会忘记调用close方法去关闭连接,排除了程序的问题,也想不出来是什么导致的了;

    于是去拿了往采集服务器上传数据的探针的日志查看,竟然有大量的一个异常:

[plain] view plain copy
 
  1. 2016-11-24 16:27:36,217 [TingYun Harvest Service 1] 166 WARN  - Error occurred sending metric data to TingYun. There can be intermittent connection failures. Please wait for a short period of time: java.net.SocketTimeoutException: Read timed out  
  2. java.net.SocketTimeoutException: Read timed out  
  3.     at java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.7.0_60]  
  4.     at java.net.SocketInputStream.read(SocketInputStream.java:152) ~[na:1.7.0_60]  
  5.     at java.net.SocketInputStream.read(SocketInputStream.java:122) ~[na:1.7.0_60]  
  6.     at com.tingyun.agent.libs.org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SourceFile:136) ~[tingyun-agent-java.jar:2.1.3]  
  7.         .................  

    都是read time out异常,那么问题就明确了,  是探针端读取超时了,断开了连接,而这时候数据采集服务器还在处理请求,它并不知道探针端已经断开了连接,处理完请求后再将处理结果发给探针,就broken pipe了;

    原来这个异常是客户端读取超时关闭了连接,这时候服务器端再向客户端已经断开的连接写数据时就发生了broken pipe异常!

 

    探针读超时的时间是2分钟,服务器为什么这么长的时间都没有响应呢?于是使用jstack命令导出了tomcat的线程栈信息进行分析,最后发现代码中有耗时的操作加了锁,导致线程阻塞(保密原因,在这里就不贴代码了);

2
0
分享到:
评论

相关推荐

    解决删除目录提示:System.IO.IOException: 目录不是空的。

    在编程过程中,尤其是在使用C#...通过以上方法,你可以有效地解决“System.IO.IOException: 目录不是空的”的问题,同时在编写文件系统操作代码时也能更加安全和可靠。记得在实际应用中根据具体需求进行调整和优化。

    Eclipse 进行 ANT 时错误 Javadoc failed java.io.IOException Cannot run program javadoc

    在Eclipse集成开发环境(IDE)中使用ANT进行项目构建时,可能会遇到特定的错误提示:“Javadoc failed java.io.IOException Cannot run program javadoc”。这个错误信息表明在生成Java文档的过程中出现了问题,具体...

    java.io.FileNotFoundException: *****(Too many open files)

    在Java编程中,"java.io.FileNotFoundException: ***** (Too many open files)" 是一个常见的错误,意味着程序尝试打开的文件数量超过了操作系统的限制。这个错误通常出现在处理大量文件或长时间运行的程序中,尤其...

    org.apache.catalina.connector.ClientAbortException和TOMCAT的日志配置

    问题1:TOMCAT下载文件出错:org.apache.catalina.connector.ClientAbortException. 问题2:TOMCAT记录接收数据大小、发送数据大小和请求处理时间

    java.io.IOException(解决方案).md

    对于java.io.IOException的解决方案,主要的方法是通过try-catch块来捕获并处理它,同时也可以采取一些预防措施来减少异常发生的可能性。 首先,在编写涉及I/O操作的代码时,应当谨慎考虑可能引发IOException的各种...

    System.IO.IOException(解决方案).md

    当我们在进行程序开发,尤其是涉及文件操作时,经常会遇到一个让人头疼的异常:System.IO.IOException。这个异常通常表示在进行输入/输出操作时遇到了某些问题,比如文件不存在、文件正在被其他程序使用,或者是权限...

    JSP上传图片产生 java.io.IOException: Stream closed异常解决方法

    把 java 代码直接改成 jsp,上传时产生 如下异常: 2012-12-31 8:59:21 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() for servlet jsp threw exception java.io.IOException: ...

    java.io.UncheckedIOException(解决方案).md

    在代码处理上,当调用Java IO类库的方法时,例如使用BufferedReader读取文件内容,一旦发生异常,我们可以捕获IOException并抛出一个UncheckedIOException,如代码示例所示。这样做的好处是可以在调用层次上透明地...

    java.io.CharConversionException: isHexDigit 出现错误的原因及其解决办法

    Java中的`CharConversionException`是`IOException`的一个子类,主要在字符编码转换过程中遇到问题时抛出。在你的问题中,错误提示是"java.io.CharConversionException: isHexDigit",这通常意味着在处理字符或字符...

    java.io.NotActiveException(解决方案).md

    在Java编程中,`java.io.NotActiveException`异常通常与输入/输出操作有关,例如网络连接或文件操作。这个异常表明你尝试在一个不活跃的输入流或输出流上执行操作。解决这个问题的关键在于确保在进行读写操作之前,...

    UnlimitedJCEPolicyJDK8.rar

    java安装路径Java\jre\lib\security下替换这两个架包,即可解决 java.security.cert.CertificateException: Unable to initialize, java.io.IOException: Short read of DER length

    AndroidApk混淆编译时,报告java.io.IOException…错误解决办法

    Java.io.IOException: The same input jar [E:\Android\myProgram\angel\libs\alipaySdk-20160825.jar] is specified twice. 首先 看一下我项目中关于此jar的配置,我在libs中导入了alipaySdk-20160825.jar,

    jenkins所需的插件等

    1. **安装 Java**:Jenkins 需要 Java 运行环境,确保系统已安装最新版的 JDK。 2. **下载 Jenkins**:从官方网站获取适合 Linux 平台的 Jenkins 可执行文件。 3. **启动 Jenkins**:通过命令行启动 Jenkins,例如...

    java.io包讲解

    ### Java.io包详解 #### 一、概述 Java.io包是Java编程语言中非常重要的一个标准库,它提供了丰富的类和接口,支持多种输入/输出流的处理方式,包括文件I/O、网络通信等场景。Java.io包的核心设计思想是以流...

    报错:java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.-附件资源

    报错:java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.-附件资源

    AndroidApk混淆编译时,报告java.io.IOException...错误解决办法

    主要介绍了 AndroidApk混淆编译时,报告Error:Execution failed for task ‘:gviews:transformClassesAndResourcesWithProguardForRelease’.错误解决办法的相关资料,需要的朋友可以参考下

    elasticsearch-rest-client-6.5.4-cus.jar

    针对java.io.IOException: entity content is too long [180278508] for the configured buffer limit [157286400]异常,将 DEFAULT_BUFFER_LIMIT修改为150M

    java.security.InvalidKeyException:illegal Key Size

    在Java编程环境中,"java.security.InvalidKeyException: illegal Key Size" 是一个常见的错误,通常发生在加密或解密操作中。这个错误表示你试图使用的密钥长度超过了Java默认的安全限制。在给定的上下文中,这个...

    BasicAuth2.java

    java.io.IOException: Server returned HTTP response code: 403 for URL 处理过程记录 BASIC AUTH2 POST接口,解决403问题

Global site tag (gtag.js) - Google Analytics