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
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.7.0_60]
at java.net.SocketInputStream.read(SocketInputStream.java:152) ~[na:1.7.0_60]
at java.net.SocketInputStream.read(SocketInputStream.java:122) ~[na:1.7.0_60]
at com.tingyun.agent.libs.org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SourceFile:136) ~[tingyun-agent-java.jar:2.1.3]
.................
都是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命令,这里还好忽略了这一步,否则可能又要花费一些时间来查找系统真正的问题;
通过这个案例可知,排查问题时,在有些情况下,你第一眼看到的异常信息未必就是问题的根源所在,而是后续一些连锁反应,尤其是当大量出现同一个异常的情况下,不要看最后一条异常日志,应该先去日志里面查找第一出现该异常的位置,看看这个异常发生之前系统的状况;
java tcp/ip异常
- 1 java.net.SocketTimeoutException .
这 个异 常比较常见,socket 超时。一般有 2 个地方会抛出这个,一个是 connect 的 时 候 , 这 个 超 时 参 数 由connect(SocketAddress endpoint,int timeout) 中的后者来决定,还有就是 setSoTimeout(int timeout),这个是设定读取的超时时间。它们设置成 0 均表示无限大。
- 2 java.net.BindException:Address already in use: JVM_Bind
该 异 常 发 生 在 服 务 器 端 进 行 new ServerSocket(port) 或者 socket.bind(SocketAddress bindpoint)操作时。
原因:与 port 一样的一个端口已经被启动,并进行监听。此时用 netstat –an 命令,可以看到一个 Listending 状态的端口。只需要找一个没有被占用的端口就能解决这个问题。
- 3 java.net.ConnectException: Connection refused: connect
该异常发生在客户端进行 new Socket(ip, port)或者 socket.connect(address,timeout)操作时,原 因:指定 ip 地址的机器不能找到(也就是说从当前机器不存在到指定 ip 路由),或者是该 ip 存在,但找不到指定的端口进行监听。应该首先检查客户端的 ip 和 port是否写错了,假如正确则从客户端 ping 一下服务器看是否能 ping 通,假如能 ping 通(服务服务器端把 ping 禁掉则需要另外的办法),则 看在服务器端的监听指定端口的程序是否启动。
- 4 java.net.SocketException: Socket is closed
该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了 Socket 的 close 方法)再对网络连接进行读写操作。
- 5 java.net.SocketException: Connection reset 或者Connect reset by peer:Socket write error
connection reset by peer在调用write或者read的时候都会出现。按照glibc的说法,是such as by the remote machine rebooting or an unrecoverable protocol violation。从字面意义上来看,是表示远端机器重启或者发生不可恢复的错误。从我的测试来看,目前只出现在对端直接kill掉进程的情况。这两种情况有什么不同呢?对比tcpdump的截包图来看,直接kill掉远端进程的话,远端并没有发送FIN序号,来告诉对方,我已经关闭管道,而是直接发送了RST序号,而远端如果调用close或者shutdown的话,是会发送FIN序号的。按照TCP的四次挥手来看,是需要FIN这个序号的。个人猜测,如果在本端没有收到对方的FIN序号而直接收到了RST序号的话,表明对端出现了machine rebooting or an unrecoverable protocol violation,这时候对这个管道的IO操作,就会出现connection reset by peer错误。
该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是假如一端的 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) 在数据传输的过程中,浏览器或者接收客户端关闭了,而服务端还在向客户端发送数据。
- 6 java.net.SocketException: Broken pipe
更详细连接在这里:https://www.cnblogs.com/metoy/p/6565486.html
该异常在客户端和服务器均有可能发生。在抛出SocketExcepton:Connect reset by peer:Socket write error 后,假如再继续写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接,其次是要检测对方的关闭连接操作,发现对方 关闭连接后自己也要关闭该连接。
broken pipe只出现在调用write的时候。broken pipe的意思是对端的管道已经断开,往往发生在远端把这个读/写管道关闭了,你无法在对这个管道进行读写操作。从tcp的四次挥手来讲,远端已经发送了FIN序号,告诉你我这个管道已经关闭,这时候,如果你继续往管道里写数据,第一次,你会收到一个远端发送的RST信号,如果你继续往管道里write数据,操作系统就会给你发送SIGPIPE的信号,并且将errno置为Broken pipe(32),如果你的程序默认没有对SIGPIPE进行处理,那么程序会中断退出。一般情况下,可以用signal(SIGPIPE,SIG_IGN)忽略这个信号,这样的话程序不会退出,但是write会返回-1并且将errno置为Broken pipe(32)。broken pipe只会出现在往对端已经关闭的管道里写数据的情况下(在收到对端的RST序号后第一次写不会出现broke pipe,而是write返回-1,这时候正确的做法应该是本端也close这个管道,如果继续write,那么就会出现这个错误)。
java.net.SocketException: Broken pipe (Write failed)
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
at sun.security.ssl.OutputRecord.writeBuffer(OutputRecord.java:431)
at sun.security.ssl.OutputRecord.write(OutputRecord.java:417)
at sun.security.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:886)
at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:857)
at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123)
at org.apache.http.impl.io.SessionOutputBufferImpl.streamWrite(SessionOutputBufferImpl.java:124)
at org.apache.http.impl.io.SessionOutputBufferImpl.write(SessionOutputBufferImpl.java:160)
at org.apache.http.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:113)
at org.apache.http.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:120)
at org.apache.http.entity.StringEntity.writeTo(StringEntity.java:167)
at org.apache.http.impl.DefaultBHttpClientConnection.sendRequestEntity(DefaultBHttpClientConnection.java:156)
at org.apache.http.impl.conn.CPoolProxy.sendRequestEntity(CPoolProxy.java:160)
at org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:238)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
对于 4 和 5 这两种情况的异常,需要特别注意连接的维护。在短连接情况下还好,如果是长连接情况,对于连接状态的维护不当,则非常容易出现异常。基本上对长连接需要做的就是:
a) 检测对方的主动断连(对方调用了 Socket 的 close 方法)。因为对方主动断连,另一方如果在进行读操作,则此时的返回值是-1。所以一旦检测到对方断连,则主动关闭己方的连接(调用 Socket 的 close 方法)。
b) 检测对方的宕机、异常退出及网络不通,一般做法都是心跳检测。双方周期性的发送数据给对方,同时也从对方接收“心跳数据”,如果连续几个周期都没有收到 对方心跳,则可以判断对方或者宕机或者异常退出或者网络不通,此时也需要主动关闭己方连接;如果是客户端可在延迟一定时间后重新发起连接。虽然 Socket 有一个keep alive 选项来维护连接,如果用该选项,一般需要两个小时才能发现对方的宕机、异常退出及网络不通。
- 7 java.net.SocketException: Too many open files
原因: 操作系统的中打开文件的最大句柄数受限所致,常常发生在很多个并发用户访问服务器的时候。因为为了执行每个用户的应用服务器都要加载很多文件(new 一个socket 就需要一个文件句柄),这就会导致打开文件的句柄的缺乏。
解决方式:
a) 尽量把类打成 jar 包,因为一个 jar 包只消耗一个文件句柄,如果不打包,一个类就消耗一个文件句柄。
b) java 的 GC 不能关闭网络连接打开的文件句柄,如果没有执行 close()则文件句柄将一直存在,而不能被关闭。
也可以考虑设置 socket 的最大打开 数来控制这个问题。对操作系统做相关的设置,增加最大文件句柄数量。
ulimit -a 可以查看系统目前资源限制,ulimit -n 10240 则可以修改,这个修改只对当前窗口有效。
- 8 Cannot assign requested address
1. 端口号被占用,导致地址无法绑定:
java.net.BindException: Cannot assign requested address: bind:是由于IP地址变化导致的;
2. 服务器网络配置异常:
/etc/hosts 中配置的地址错误;
3.还有一种情况是执行ipconfig 发现没有环路地址,这是因为环路地址配置文件丢失了;
今天公司技术支持的童鞋报告一个客户的服务不工作了,紧急求助,于是远程登陆上服务器排查问题。 查看采集数据的tomcat日志,习惯性的先翻到日志的最后去查看有没有异常的打印,果然发现了好几种异常信息,但是最多还是这个:24-Nov-2016 09:54:21.116 SEVERE [http-nio-8081-Acceptor-0] org.apache.tomcat.uti...
我在进行MapReduce本地测试的时候,遇见下面的报错:
Exception in thread “main” java. lang . UnsatisfiedLinkError: org. apache . hadoop. io. nativeio. NativeIOSWindows . access0 (Ijava/ lang/String;I)Z
原因:在调用NativeIO中的access0()时调不到
解决方法:①第一步:在项目工程中加入NativelO.java,注意包名必须与源码中一致
②第二步:将access方法的返回值改为true,不让他去调用access0()
org.apache.catalina.connector.ClientAbortException: java.io.IOException: 断开的管道
at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:321)
at org.apache.catalina....
Error: org.apache.thrift.transport.TTransport
Exception:
java.net.Socket
Exception:
断开的
管道 (Write failed) (state=08S01,code=0)
hive建表报错
原因:hiveserver2服务未开启,开启hiveserver2服务,重新连接hive belline即可。
这个异常是由于以下几个原因造成。
1、客户端再发起请求后没有等服务器端响应,点击了stop按钮,导致服务器端接收到取消请求(频繁的刷新就会产生此问题)。
2、客户端发送请求连接时间设置过短,后台服务器没有处理完响应,客户端就
断开连接,一般这种原因比较容易出现。
3、web服务器,如tomcat在接受用户请求时由于处理能力,如线程、内存、服务器等各个资源限制,超出Tomcat承载范围的请求,就会被tomcat停掉,也可能产生该错误
在做 jsp 上传图片时,把 java 代码直接改成 jsp,上传时产生 如下异常: 2012-12-31 8:59:21 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() for servlet jsp threw exception java.io.IOException: Stream closed … 百思不得其解,翻出 jsp 转成 servlet 后的代码。如下(很很的醒目一下): 代码如下: … }catch(Exception e){ e.printStackTrace();
客户端中止异常:
java.
io.
IOException:
管道中断。
这个异常通常是由于客户端在与服务器通信时突然中止或
断开连接导致的。这可能是由于网络问题、客户端崩溃或其他原因引起的。当服务器尝试向已经关闭的客户端发送数据时,就会抛出这个异常。
### 回答2:
clientabortexception:
java.
io.
ioexception:
broken pipe 这个错误通常出现在网络编程中,它的意思是客户端中止了请求,导致服务器无法正确处理请求,抛出了异常。具体来说,这个错误通常是因为客户端在服务器还没来得及完全处理完请求时强制
断开连接导致的。
造成客户端意外
断开连接的原因有很多,比如客户端程序出现了意外崩溃,网络故障,或者其他因素。无论出现这个错误的原因是什么,一旦出现,服务器都需要及时做出响应,防止异常的扩散和影响服务正常运行的范围。
对于这个问题,我们可以从以下几个方面入手
解决:
1. 优化服务器性能:尽可能减少服务器的响应时间,减少客户端等待响应的时间,从而尽可能减少客户端在等待过程中意外中断连接的可能性。
2. 异常处理机制:对于出现的异常,服务器要有完善的异常处理机制,及时发现、诊断、记录并处理异常,避免因为一个异常导致服务器整个服务崩溃。
3. 连接保持机制:程序可以在调用网络资源之前先保持一个连接,在资源请求调用结束后再关闭连接,这样避免多次连接的开启与关闭,从而极大降低网络连接异常的可能性。
4. 设置超时:在进行网络操作时,可以设置超时参数,当连接超过一定时间或者请求超过一定时间时服务器会主动
断开连接,以此保障服务器的正常运行。
总之,
clientabortexception:
java.
io.
ioexception:
broken pipe这个错误需要我们从多方面入手,同时敏锐感知和进一步优化系统,才能最大限度避免此类错误的发生,提高服务的性能和稳定性。
### 回答3:
在
Java编程中,当客户端中断了正在进行的与服务器的连接时,就会出现一个称为
clientabortexception的异常。当这种异常被触发后,通常会出现一个关于“
broken pipe”的错误消息。这个错误消息的意思是说,客户端和服务器之间的通信
管道已被中断或破损,通常是由于客户端意外关闭或者超时而导致的。
在实际开发中,这种异常通常会在
Java Socket编程中出现,这时我们就需要在代码中进行处理,以避免出现严重的错误情况。最常见的处理方式就是使用try.catch语句来捕获异常,并根据不同的情况进行处理。
首先,当客户端异常关闭时,我们可以通过检查Socket对象的isConnected()和is
Closed()
方法来判断是否关闭了连接,如果连接已关闭,则需要清理资源,并停止当前程序的运行。另外,当客户端超时时,我们可以提高Socket对象的读取超时时间,以避免超时导致的
管道中断。在这种情况下,我们可以使用Socket对象的setSoTimeout()
方法来设置超时时间。
总之,当
Java程序出现
clientabortexception:
java.
io.
ioexception:
broken pipe异常时,我们应该在代码中进行适当的异常处理,以避免引起更严重的错误。需要根据具体的情况进行处理,比如关闭连接或者设置读取超时时间等。只有这样,我们才能保证程序的稳定运行。