実行速度が非常に遅く、時々ハングする Web アプリケーションがあります。これは、レポートと編集機能を備えた学校関連の Wicket アプリであり、自動化されたクライアントが HTTPS 経由でデータを取得/投稿するために使用するサーブレットでもあります。
多くの編集/アップロード/ダウンロードが行われている忙しい時間帯には、アプリが遅くなり、応答しなくなります。Wicket の「PageMap はまだロックされています」というエラーが表示されます。Tomcat は動き続けているようです。メモリ使用量は管理可能で、約 50M です。
プロファイリング情報を取得するように YourKit をセットアップしたところ、忙しい時期に Tomcat の CPU 時間の 81% がここで費やされていることがわかりました。
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run()
org.apache.jk.common.ChannelSocket$SocketConnection.runIt(Object[])
org.apache.jk.common.ChannelSocket.processConnection(MsgContext)
org.apache.jk.common.ChannelSocket.receive(Msg, MsgContext)
org.apache.jk.common.ChannelSocket.read(MsgContext, byte[], int, int)
java.io.BufferedInputStream.read(byte[], int, int)
java.io.BufferedInputStream.read1(byte[], int, int)
java.io.BufferedInputStream.fill()
java.net.SocketInputStream.read(byte[], int, int)
[Wall Time] java.net.SocketInputStream.socketRead0(FileDescriptor, byte[], int, int, int)
このアプリでは、約 250 のクライアントが SSL 経由でサーバーをポーリングし、30 秒ごとに更新を要求しています。ほとんどの場合、これはすぐに空の応答を返します。時折、DB アクティビティが急増し、大量のデータ (数 MB) がクライアントに送り返されることがあります。
では、この 81% のアクティビティは何によるものでしょうか? 接続が非常に遅い少数のクライアントは、Tomcat スレッドが着信要求本文を待機する原因となり、Tomcat スレッドを停止させる可能性がありますか?
このようなものを見た人はいますか、またはこれをテスト/トラブルシューティング/修正する方法について何かアドバイスはありますか?