1、Broken pipe产生缘由分析spring
1.当访问某个服务忽然服务器挂了,就会产生Broken pipe;apache
2.客户端读取超时关闭了链接,这时服务器往客户端再写数据就发生了broken pipe异常!json
2、方案浏览器
1.问题一分析服务器为何挂了。tomcat
2.问题二使用jps/jstack分析线程栈,看是否是有线程阻塞。服务器
1.问题出现html
昨晚项目在上线的时候由于推广的缘由,新增的大量请求。在八点的时候。java
org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:356) ~[tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:825) ~[tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:730) ~[tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:391) ~[tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:369) ~[tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:96) ~[tomcat-embed-core-8.5.31.jar!/:8.5.31] at com.fasterxml.jackson.core.json.UTF8JsonGenerator._flushBuffer(UTF8JsonGenerator.java:2085) ~[jackson-core-2.9.5.jar!/:2.9.5] at com.fasterxml.jackson.core.json.UTF8JsonGenerator._writeStringSegment2(UTF8JsonGenerator.java:1400) ~[jackson-core-2.9.5.jar!/:2.9.5] at com.fasterxml.jackson.core.json.UTF8JsonGenerator._writeStringSegment(UTF8JsonGenerator.java:1347) ~[jackson-core-2.9.5.jar!/:2.9.5] at com.fasterxml.jackson.core.json.UTF8JsonGenerator._writeStringSegments(UTF8JsonGenerator.java:1228) ~[jackson-core-2.9.5.jar!/:2.9.5] at com.fasterxml.jackson.core.json.UTF8JsonGenerator.writeString(UTF8JsonGenerator.java:453) ~[jackson-core-2.9.5.jar!/:2.9.5] at com.fasterxml.jackson.databind.ser.std.StringSerializer.serialize(StringSerializer.java:41) ~[jackson-databind-2.9.5.jar!/:2.9.5] at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727) ~[jackson-databind-2.9.5.jar!/:2.9.5] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:719) ~[jackson-databind-2.9.5.jar!/:2.9.5] at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155) ~[jackson-databind-2.9.5.jar!/:2.9.5] at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119) ~[jackson-databind-2.9.5.jar!/:2.9.5] at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79) ~[jackson-databind-2.9.5.jar!/:2.9.5] at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:18) ~[jackson-databind-2.9.5.jar!/:2.9.5] at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727) ~[jackson-databind-2.9.5.jar!/:2.9.5] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:719) ~[jackson-databind-2.9.5.jar!/:2.9.5] at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155) ~[jackson-databind-2.9.5.jar!/:2.9.5] at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727) ~[jackson-databind-2.9.5.jar!/:2.9.5] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:719) ~[jackson-databind-2.9.5.jar!/:2.9.5] at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155) ~[jackson-databind-2.9.5.jar!/:2.9.5] at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480) ~[jackson-databind-2.9.5.jar!/:2.9.5] at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319) ~[jackson-databind-2.9.5.jar!/:2.9.5] at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1396) ~[jackson-databind-2.9.5.jar!/:2.9.5] at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:913) ~[jackson-databind-2.9.5.jar!/:2.9.5] at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:286) ~[spring-web-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:102) ~[spring-web-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:272) ~[spring-webmvc-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:180) ~[spring-webmvc-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:82) ~[spring-web-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:119) ~[spring-webmvc-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877) ~[spring-webmvc-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783) ~[spring-webmvc-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) ~[spring-webmvc-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) ~[spring-webmvc-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974) ~[spring-webmvc-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877) ~[spring-webmvc-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at javax.servlet.http.HttpServlet.service(HttpServlet.java:661) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) ~[spring-webmvc-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-embed-websocket-8.5.31.jar!/:8.5.31] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:158) [spring-boot-actuator-2.0.2.RELEASE.jar!/:2.0.2.RELEASE] at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:126) [spring-boot-actuator-2.0.2.RELEASE.jar!/:2.0.2.RELEASE] at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:111) [spring-boot-actuator-2.0.2.RELEASE.jar!/:2.0.2.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123) [druid-1.1.10.jar!/:1.1.10] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:84) [spring-boot-actuator-2.0.2.RELEASE.jar!/:2.0.2.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) [spring-web-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109) [spring-web-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) [spring-web-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.springframework.cloud.sleuth.instrument.web.ExceptionLoggingFilter.doFilter(ExceptionLoggingFilter.java:48) [spring-cloud-sleuth-core-2.0.1.RELEASE.jar!/:2.0.1.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at brave.servlet.TracingFilter.doFilter(TracingFilter.java:86) [brave-instrumentation-servlet-5.1.4.jar!/:na] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) [spring-web-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.6.RELEASE.jar!/:5.0.6.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_172] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_172] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.31.jar!/:8.5.31] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_172] Caused by: java.io.IOException: Broken pipe at sun.nio.ch.FileDispatcherImpl.write0(Native Method) ~[na:1.8.0_172] at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47) ~[na:1.8.0_172] at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) ~[na:1.8.0_172] at sun.nio.ch.IOUtil.write(IOUtil.java:65) ~[na:1.8.0_172] at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471) ~[na:1.8.0_172] at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:134) ~[tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:101) ~[tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:157) ~[tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1276) ~[tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:670) ~[tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.tomcat.util.net.SocketWrapperBase.writeBlocking(SocketWrapperBase.java:450) ~[tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:388) ~[tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.doWrite(Http11OutputBuffer.java:623) ~[tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:123) ~[tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.coyote.http11.Http11OutputBuffer.doWrite(Http11OutputBuffer.java:225) ~[tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.coyote.Response.doWrite(Response.java:541) ~[tomcat-embed-core-8.5.31.jar!/:8.5.31] at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:351) ~[tomcat-embed-core-8.5.31.jar!/:8.5.31] ... 99 common frames omitted
百度以后最简单解释: web
1、Broken pipe产生缘由分析spring
1.当访问某个服务忽然服务器挂了,就会产生Broken pipe;apache
2.客户端读取超时关闭了链接,这时服务器往客户端再写数据就发生了broken pipe异常!json
2、方案浏览器
1.问题一分析服务器为何挂了。tomcat
2.问题二使用jps/jstack分析线程栈,看是否是有线程阻塞。服务器
其实就是服务器扛不住请求了,因此把日志级别先调整到error而后项目重启。问题解决。websocket
2.来看看专业人员的解释。
今天公司技术支持的童鞋报告一个客户的服务不工做了,紧急求助,因而远程登录上服务器排查问题。
查看采集数据的tomcat日志,习惯性的先翻到日志的最后去查看有没有异常的打印,果真发现了好几种异常信息,可是最多仍是这个:
“Too manay open files” 问题很明显啊,文件描述符超出限制致使没法打开文件或建立网络链接,这个问题又会致使一些其它问题的产生,确定是ulimit没有优化,因而检查ulimit的设置;
open files居然是65535,已经作过了优化,是否是先启动的tomcat等服务,而后才对ulimit作的优化?有可能,这样的话重启一下服务就ok了,因而将所有服务重启了一遍,运行正常了,不一会报表就显示数据了,而后告诉技术支持,问题已经解决了,而后就去处理别的case了;
结果还不到20分钟,技术支持说,报表又没有数据了,因而又打数据采集的应用的tomcat日志查看,发现了一堆异常,全都是一个错:
这个异常很是多,看报错信息,是tomcat的connector在执行写操做的时候发生了Broken pipe异常,connector是tomcat处理网络请求的,难道是网络出问题了,可是为何发生异常的都是写,读就没问题呢?为了判断是否是网络问题,因而用wget命令在本地访问了一下服务器的一个接口,结果发现等了很久都没有响应,正常状况下应该是立刻就有响应的,这说明不是网络的缘由,是服务器的问题,又用命令查看了下当前tcpip链接的状态:
CLOSE_WAIT 状态的链接居然有3853个,这太不正常了,这说明是客户端先关闭了链接,服务器端没有执行关闭链接的操做,致使服务器端一直维持在CLOSE_WAIT的状态,若是不对操做系统的keepalive作优化,这个状态默认会维持两个小时,查看了下系统的设置:
果真是7200秒,这就解释通了,为何第一次查看tomcat日志最后报错都是“Too manay open files”异常,必定是在两个小时内,close_wait状态暴增,致使文件描述符超过了65535的最大限制;
而这个状态应该就是broken pipe 异常致使的,是什么致使的broken pipe异常呢?为何探针关闭了链接,可是数据采集服务器却没有关闭链接?报异常的是tomcat的connector,tomcat不可能会忘记调用close方法去关闭链接,排除了程序的问题,也想不出来是什么致使的了;
因而去拿了往采集服务器上传数据的探针的日志查看,居然有大量的一个异常:
都是read time out异常,那么问题就明确了, 是探针端读取超时了,断开了链接,而这时候数据采集服务器还在处理请求,它并不知道探针端已经断开了链接,处理完请求后再将处理结果发给探针,就broken pipe了;
原来这个异常是客户端读取超时关闭了链接,这时候服务器端再向客户端已经断开的链接写数据时就发生了broken pipe异常!
探针读超时的时间是2分钟,服务器为何这么长的时间都没有响应呢?因而使用jstack命令导出了tomcat的线程栈信息进行分析,最后发现代码中有耗时的操做加了锁,致使线程阻塞(保密缘由,在这里就不贴代码了);
这里总结一下,给我发私信的有些朋友没有get到Broken piple问题的重点,并非只有超时才会致使这个问题,只要是链接断开,再往这个断开的链接上去执行写操做,都会出现这个异常,客户端超时断开只是其中的一种状况:
另外,当看到“Too manay open files”异常的时候,一般作法除了检查ulimit系统限制外,还应该看一下进程打开的文件句柄数,cat /proc/sys/fs/file-nr命令查看系统总句柄数,当前应用打开的文件句柄数使用ls -l /proc/<pid>/fd | wc -l命令,这里还好忽略了这一步,不然可能又要花费一些时间来查找系统真正的问题;
经过这个案例可知,排查问题时,在有些状况下,你第一眼看到的异常信息未必就是问题的根源所在,而是后续一些连锁反应,尤为是当大量出现同一个异常的状况下,不要看最后一条异常日志,应该先去日志里面查找第一出现该异常的位置,看看这个异常发生以前系统的情况;
这 个异 常比较常见,socket 超时。通常有 2 个地方会抛出这个,一个是 connect 的 时 候 , 这 个 超 时 参 数 由connect(SocketAddress endpoint,int timeout) 中的后者来决定,还有就是 setSoTimeout(int timeout),这个是设定读取的超时时间。它们设置成 0 均表示无限大。
该 异 常 发 生 在 服 务 器 端 进 行 new ServerSocket(port) 或者 socket.bind(SocketAddress bindpoint)操做时。
缘由:与 port 同样的一个端口已经被启动,并进行监听。此时用 netstat –an 命令,能够看到一个 Listending 状态的端口。只须要找一个没有被占用的端口就能解决这个问题。
该异常发生在客户端进行 new Socket(ip, port)或者 socket.connect(address,timeout)操做时,原 因:指定 ip 地址的机器不能找到(也就是说从当前机器不存在到指定 ip 路由),或者是该 ip 存在,但找不到指定的端口进行监听。应该首先检查客户端的 ip 和 port是否写错了,假如正确则从客户端 ping 一下服务器看是否能 ping 通,假如能 ping 通(服务服务器端把 ping 禁掉则须要另外的办法),则 看在服务器端的监听指定端口的程序是否启动。
该异常在客户端和服务器都可能发生。异常的缘由是己方主动关闭了链接后(调用了 Socket 的 close 方法)再对网络链接进行读写操做。
该异常在客户端和服务器端均有可能发生,引发该异常的缘由有两个,第一个就是假如一端的 Socket 被关闭(或主动关闭或者由于异常退出而引发的关闭), 另外一端仍发送数据,发送的第一个数据包引起该异常(Connect reset by peer)。另外一个是一端退出,但退出时并未关闭该链接,另 一 端 假 如 在 从 连 接 中 读 数 据 则 抛 出 该 异 常(Connection reset)。简单的说就是在链接断开后的读和写操做引发的。
还有一种状况,若是一端发送RST数据包中断了TCP链接,另一端也会出现这个异常,若是是tomcat,异常以下:
org.apache.catalina.connector.ClientAbortException: java.io.IOException: Connection reset by peer
阿里的tcp方式的健康检查为了提升性能,省去挥手交互,直接发送一个RST来终断链接,就会致使服务器端出现这个异常;
对于服务器,通常的缘由能够认为:
a) 服务器的并发链接数超过了其承载量,服务器会将其中一些链接主动 Down 掉.
b) 在数据传输的过程当中,浏览器或者接收客户端关闭了,而服务端还在向客户端发送数据。
该异常在客户端和服务器均有可能发生。在抛出SocketExcepton:Connect reset by peer:Socket write error 后,假如再继续写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭全部的网络链接,其次是要检测对方的关闭链接操做,发现对方 关闭链接后本身也要关闭该链接。
对于 4 和 5 这两种状况的异常,须要特别注意链接的维护。在短链接状况下还好,若是是长链接状况,对于链接状态的维护不当,则很是容易出现异常。基本上对长链接须要作的就是:
a) 检测对方的主动断连(对方调用了 Socket 的 close 方法)。由于对方主动断连,另外一方若是在进行读操做,则此时的返回值是-1。因此一旦检测到对方断连,则主动关闭己方的链接(调用 Socket 的 close 方法)。
b) 检测对方的宕机、异常退出及网络不通,通常作法都是心跳检测。双方周期性的发送数据给对方,同时也从对方接收“心跳数据”,若是连续几个周期都没有收到 对方心跳,则能够判断对方或者宕机或者异常退出或者网络不通,此时也须要主动关闭己方链接;若是是客户端可在延迟必定时间后从新发起链接。虽然 Socket 有一个keep alive 选项来维护链接,若是用该选项,通常须要两个小时才能发现对方的宕机、异常退出及网络不通。
缘由: 操做系统的中打开文件的最大句柄数受限所致,经常发生在不少个并发用户访问服务器的时候。由于为了执行每一个用户的应用服务器都要加载不少文件(new 一个socket 就须要一个文件句柄),这就会致使打开文件的句柄的缺少。
解决方式:
a) 尽可能把类打成 jar 包,由于一个 jar 包只消耗一个文件句柄,若是不打包,一个类就消耗一个文件句柄。
b) java 的 GC 不能关闭网络链接打开的文件句柄,若是没有执行 close()则文件句柄将一直存在,而不能被关闭。
也能够考虑设置 socket 的最大打开 数来控制这个问题。对操做系统作相关的设置,增长最大文件句柄数量。
ulimit -a 能够查看系统目前资源限制,ulimit -n 10240 则能够修改,这个修改只对当前窗口有效。
1. 端口号被占用,致使地址没法绑定:
java.net.BindException: Cannot assign requested address: bind:是因为IP地址变化致使的;
2. 服务器网络配置异常:
/etc/hosts 中配置的地址错误;
3.还有一种状况是执行ipconfig 发现没有环路地址,这是由于环路地址配置文件丢失了;、
--------------------- 做者:朱清震 来源:CSDN 原文:https://blog.csdn.net/zqz_zqz/article/details/52235479
转载引用 ------------http://www.javashuo.com/article/p-cvmevxzg-n.html