AWS にデプロイされた Apache サーバーからのリバース プロキシを使用して Tomcat で実行されているアプリケーションは、ピーク時に (時々) 遅くなります。

AWS にデプロイされた Apache サーバーからのリバース プロキシを使用して Tomcat で実行されているアプリケーションは、ピーク時に (時々) 遅くなります。

前置きとして、私はソフトウェア開発者ですが、最初は何が起こっているのか誰もわからなかったので、いくつかテストと調査を行い、同僚がこの問題を解決できるように支援したいと思います。

問題:

問題は、ピーク時にサーバーが非常に遅くなり、Chrome などのブラウザーで接続がタイムアウトする (30 秒後) にもかかわらず、サーバーは引き続き稼働しており、約 100 秒後にページを提供できることです (insomnia でテスト済み)。abs ...実稼働サーバーを使用して問題を再現しましたが、同時リクエストの数と関係があり、おそらく Apache サーバーの構成が原因です。

より詳しい情報:

開発中は tomcat8 をローカルで実行し、" " でテストしましたがabs -c 200 -n 2000 https:/[link]、実行時間は問題ありません。しかし、実稼働サーバーをテストすると、同時リクエストが 50 個あっても、テストしていた API の速度低下は顕著で、デフォルトの 800 ミリ秒から 27846 ミリ秒に低下しました。

試したことと詳細:

Java メロディーを実行していますが、Tomcat 実行スレッドのスレッド制限に達している可能性があると考え、スレッド数をデフォルトの 200 から 500 に増やしました (これはテストを行う前のことです)。前述のテストを実行すると、ビジー スレッドが 500 のうち 50 程度まで増加していることがわかります (実稼働環境で実行しているため、実際にプログラムを使用している人もいます)。しかし、それでも速度は大幅に低下します。

ピーク時には、約 1000 の http セッションがあることがわかりますが、スレッド、メモリ、CPU は 100% にはまったく近づいていません。念のため、サーバーを可能な限り最高のものにアップグレードしましたが、もちろんそれだけではありませんでした。SQL を使用していますが、SQL サーバーもピークに達していないため、それが問題であるとは思えません。

JVM 引数を真似すべきではないことはわかっていますが、同様の問題を見て、「-XX:ReservedCodeCacheSize=512M」を追加してみましたが、それでもうまくいきませんでした。また、server.xml で acceptCount を 1000 に増やしてみましたが、それでもうまくいきません。これらの変更を元に戻す必要がありますか?パフォーマンスの変化は見られず、ドキュメントを読んだ限りでは、このままにしておくのも問題ないようです。

ウェブアプリが一定時間操作がないとホームページに戻り、その後 xx 分ごとにホームページを更新し続けるという奇妙な機能があります。これはパフォーマンスに悪影響を与えると思います。特に、ユーザーが多数のタブを開いていて更新を開始すると、これが問題の原因ではないかもしれませんが、言及する価値はあります。

今日は次にApacheサーバーの引数をいじってみます。チューニングガイドそして、MaxRequestWorkers / MaxClients は、私たちが経験していることを説明する何かのように思えます。引用このディレクティブが低すぎると、Apache は利用可能なハードウェアを十分に活用できず、お金が無駄になり、ピーク時のページ読み込み時間が長くなります。

ヒントがあればありがたいです。うまくいけば、Apache サーバーだけの問題で、少なくとも今日中にサーバーを使えるようにすることができます。この速度低下の原因となる他の構成はありますか?

答え1

ウェブサーバーがリクエストの多さで詰まっている可能性があります。これはSlowLoris DOS攻撃をエミュレートするものです。前の回答話題になっている。

関連情報