Heim  >  Fragen und Antworten  >  Hauptteil

Wie kann Tomcat vor dem GC automatisch aus dem Nginx-Upstream entfernt werden, um eine Zeitüberschreitung zu vermeiden?

Tomcat führt von Zeit zu Zeit FullGC aus. Wenn Nginx zu diesem Zeitpunkt eine Anfrage sendet, kommt es zu einer Zeitüberschreitung der Anfrage.

Eine Lösung besteht darin, eine kürzere Zeitüberschreitung auf der Nginx-Seite festzulegen, die Maschine so zu ändern, dass sie die Anfrage erneut sendet. Das Problem besteht jedoch darin, dass diese Anfrage nicht erneut erfolgen darf

Ich möchte fragen: Gibt es einen Mechanismus, mit dem Nginx Tomcat automatisch vor GC entfernt und es nach Abschluss von GC automatisch wieder hinzufügt?

Kurz gesagt, es geht darum, die durch Tomcat GC verursachten Timeout-Auswirkungen zu vermeiden

PS:

Der Upstream von nginx ist mit mehreren Tomcats eingerichtet. Solange ein GC auf einem Computer auftritt, kommt es bei allen auf diesem Computer eingehenden Anfragen zu einer Zeitüberschreitung.

为情所困为情所困2686 Tage vor593

Antworte allen(1)Ich werde antworten

  • 淡淡烟草味

    淡淡烟草味2017-05-16 17:23:13

    tomcat有个防止内存溢出的监听器:

    org.apache.catalina.core.JreMemoryLeakPreventionListener
    

    我怀疑是它调System.gc()导致的,而这种GC可能是用的stop the world方式,也就是说是非并发的。你可以试一下下面两种方案:

    1.-XX:+ExplicitGCInvokesConcurrent 并发GC
    2.停用该监听器或者从JVM级别禁用直接调用-XX:+DisableExplicitGC

    然后观察一段时间吧。

    Antwort
    0
  • StornierenAntwort