サーバー側アプリケーションで、接続されたクライアントごとにソケット スレッドを開きます。各スレッドに DataInputStream があり、read(byte[]array) を呼び出してデータを読み取ります。また、ソケットのタイムアウトを数分に設定しました。主なコードは次のようなものです。
while (dataInputStream.read(array) != -1) { do something... }
ただし、数時間実行した後、jconsole で topthreads プラグインを使用すると、複数のクライアント スレッドがそれぞれ 20% 程度の CPU を使用していることがわかります。それをクリックすると、コール スタックはスレッドが上記の行の read() 関数でブロックされていることを示します。
read() 関数は通常、ブロックしてデータを待機することを知っています。ブロックされると、CPU サイクルをほとんど消費しません。今ではそれぞれ 20%ish を使用しており、同じ問題を抱えているスレッドが増えると、サーバーの実行速度がますます遅くなります。私のサーバーには 1 秒あたり約 5 件の接続要求がありますが、数時間で 5 つのスレッドだけに問題があるため、これはめったに発生しません。
私は本当に混乱しています。誰かが私を助けることができますか?