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