Tomcatのパフォーマンスの問題
質問
Webアプリケーションの実行速度が非常に遅く、時々ハングすることがあります。これは、レポートおよび編集機能を備えた学校関連のWicketアプリであり、自動化されたクライアントがHTTPS経由でデータを取得/投稿するために使用するサーブレットです。
多くの編集/アップロード/ダウンロードが行われている忙しい時間帯に、アプリの動作が遅くなり、応答しなくなります。 Wicket" PageMap still依然としてロックされています"エラー。 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)
このアプリでは、SSL経由で30秒ごとに更新を要求する約250のクライアントがサーバーをポーリングしています。ほとんどの場合、これはすぐに空の応答を返します。時折、DBアクティビティが急増し、大量のデータ(数MB)がクライアントに送り返されることがあります。
では、この81%のアクティビティは何ですか?本当に遅い接続を持つ少数のクライアントは、Tomcatスレッドがリクエストボディを受信するのを待機させることで、そのスレッドを滞らせますか?
誰もがこのようなものを見ましたか、これをテスト/トラブルシューティング/修正する方法についてアドバイスがありますか?
解決
テスト環境を設定し、負荷テストでこれを再現してください。
そうすれば、原因を特定できます。そうでなければ、要素が多すぎます。
また、この方法により、製品環境を危険にさらすことなく修正を試すことができます。
他のヒント
おそらくメモリ使用量が原因です。
javaプロセスのメモリ使用量を確認して、どれだけの量が得られているかを確認する必要があります。
十分になっていない場合は、Tomcat用に設定されている場所にXmx jvmパラメーターを設定する必要があります。