前置きとして、私はソフトウェア開発者ですが、最初は何が起こっているのか誰もわからなかったので、いくつかテストと調査を行い、同僚がこの問題を解決できるように支援したいと思います。
問題:
問題は、ピーク時にサーバーが非常に遅くなり、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攻撃をエミュレートするものです。前の回答話題になっている。