5

ソケットへの書き込みを担当するスレッド (約 4 ~ 5 MBPS の大量のデータ) がスタックし、場合によっては 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 がブロックされているということでした。しかし、この動作はせいぜい不安定です。基盤となるネットワークは問題ないようです。立ち往生する前に、何時間も正常に書き込みを行っています。

スレッドはまた、次のチャンクを書き込む前に少なくとも 50 ミリ秒の休憩を取ります。通常のブロックではない場合、他に何が考えられるでしょうか?

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)
4

1 に答える 1

3

問題は、サーバーの読み取り速度が十分ではないため、TCP 送信バッファーがいっぱいになっていることだと思います。TCP には、いつデータ パケットを送信するかを判断するのに役立つアルゴリズムがあり、それは主に転送の現在の状態に基づいています。そのため、TCP スタックが輻輳を検出した場合 (大量のデータを送信していて、サーバーが追いついていないため)。減速/一時停止します。詳細については、これをお読みください。

あなたが共有したのはスタックトレースだけなので、正確に何を修正すべきかについて簡単に答えることはできませんが、私があなただったら、この場合はクライアントではなくサーバーを見るでしょう.

于 2013-04-12T11:59:58.210 に答える