2

HTTP (POST/GET/etc) リクエストへの応答に (時々) 長い時間がかかる Web アプリケーションを想像してみてください。サーバー側でそのようなリクエストをどのように見つけますか?

これまでのところ、Tomcat AccessLogValve を使用して「完了した」リクエストを確認しましたが、「進行中」(スタック)のリクエストを確認することはできません:(

例えば:

  • 現在スタックしnetstatているリクエストの数を知ることができる長寿命のソケットを特定できますが(URIではありません)、HTTPキープアライブはこのアプローチを無効にします

  • app-server ( kill -3 <server_pid>) を複数回スタックダンプし、どのスレッドが長時間実行されているかを推測し、URI をリバース エンジニアリングすることもできますが、これも賢明な方法ではありません。

  • 現在実行中の呼び出しを表示するWebアプリサーバーの前にルーター/プロキシを挿入できます(ホスト名の置き換え、証明書のクローン)-単純なアプローチではありません

  • 継続的に実行し、トラフィックを解析して現在実行中の URI のリストを保持するだけに陥る可能性がtcpdumpありますが、その場合、httpsS はどうすればよいでしょうか?

  • 私が見つけた最も近いのは tomcat7 のStuckThreadDetectionValveで、これは長時間実行されている呼び出しを定期的に報告しますが、(URI ではなく) スタックトレースを出力し、「ライブ」データを提供しません (たとえば、定期的にポーリングし、ログをフラッディングし、状態を確認できるようにします) 1 ~ 60 秒前、「今」ではありません)

たぶん、重要/コア/基本的なTomcat機能の1つが欠けている/見落としているのでしょうか? それとも、weblogic (または他のアプリケーションサーバー) がこれに対して提供する堅牢なものを持っているのでしょうか?

このようなシンプルで本質的な機能がないと、ちょっと迷ってしまいます。ヘルプ?お願いします?

4

2 に答える 2

1

残念ながら、処理中に時間がかかっている HTTP リクエストのリストを取得する簡単な方法はありません。言及したように、数秒間隔でいくつかのスレッド ダンプを取得すると、どのスレッドが HTTP 操作の実行速度が遅いかがわかります (応答を待っているスレッド スタックはそれぞれ同じであるため)。ただし、コードをたどって URL のある静的コードに戻ることができない限り、それ以上のことはわかりません。ただし、スレッド ダンプを取得してスレッド ID を特定し、次にヒープ ダンプを取得して、ヒープ ダンプ内でそれらのスレッドを見つけることができます。単純ではなく、間違いなく単純ではありませんが、使用されている URL や待機時間などを取得できます。

于 2014-01-15T01:34:50.263 に答える