负责在套接字上写入的线程(大量数据,大约4-5MBPS)被卡住,有时长达15分钟,然后再次开始行动,然后又被卡住了部分堆栈跟踪为:
java.lang.Thread.State: RUNNABLE
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.BufferedOutputStream.write(Unknown Source)
- locked <0xa4ca4660> (a java.io.BufferedOutputStream)
mypackage.myMethod()
我的直接假设是ObjectWrite正在阻塞。但这种行为充其量是不稳定的。 底层网络似乎没问题。它在被卡住之前已经成功写了几个小时。
在写下一个块之前,线程还需要至少50ms的剩余时间。 所以,如果它不是正常的阻止,那还有什么呢?
的pstack:
ff2cba60 send (10, 4dc230, c312, 0)
fe03ce58 Java_java_net_SocketOutputStream_socketWrite0 (3a4928, c312, 10, 95f7f890, 0, c312) + 158
fc093e5c * java/lang/System.getSecurityManager()Ljava/lang/SecurityManager;+3
fc08ec3c * *java/net/SocketOutputStream.socketWrite([BII)V [compiled] +45
fc08ec3c * *java/net/SocketOutputStream.write([BII)V+5
fc005ab0 * java/io/BufferedOutputStream.write([BII)V+20
fc005ab0 * mypackage.mymethod()V+84 (line 598)
答案 0 :(得分:3)
我怀疑问题是你的服务器读取速度不够快,所以TCP发送缓冲区已经填满了。 TCP具有帮助它确定何时发送数据包的算法,并且它主要基于传输的当前状态。因此,如果TCP堆栈检测到拥塞(因为您正在发送大量数据而服务器没有跟上)。它会减慢/暂停。请阅读this了解详情。
关于究竟要修复什么,我没有一个简单的答案,因为你共享的是一个堆栈跟踪,但如果我是你,那么在这种情况下我会看服务器而不是客户端。