Tomcat は時々 fullgc を実行します。この時点で nginx がリクエストを送信すると、リクエストはタイムアウトになります。
解決策の 1 つは、nginx 側でタイムアウトを短く設定することです。応答がない場合は、マシンを変更してリクエストを再送信します。ただし、問題は、このリクエストは副作用であり、再度リクエストを行うことができないことです。
質問したいのですが、nginx が gc の前に Tomcat を自動的に削除し、gc が完了した後に自動的に追加し直すメカニズムはありますか?
要するに、Tomcat gc によるタイムアウトの影響を回避するためです~
追記:
nginx のアップストリームは複数の Tomcat で設定されています。GC が 1 回発生する限り、このマシンに送られるすべてのリクエストはタイムアウトになります。
Tomcat にはメモリ オーバーフローを防ぐためのリスナーがあります:
リーリーこれは System.gc() の調整が原因であると思われます。この GC は stop the world メソッドを使用している可能性があります。これは、非同時実行であることを意味します。次の 2 つのオプションを試すことができます:
1.-XX:+ExplicitGCInvokesConcurrent 同時 GC
2. リスナーを無効にするか、JVM レベルからの直接呼び出しを無効にします -XX:+DisableExplicitGC
その後、しばらく観察してください。