Notieren Sie einen Fehlerbehebungsbericht für die hohe CPU-Auslastung des Tomcat-Prozesses

Notieren Sie einen Fehlerbehebungsbericht für die hohe CPU-Auslastung des Tomcat-Prozesses

Dieser Artikel zeichnet hauptsächlich einen Tomcat-Prozess und die Fehlerbehebungsaufzeichnung einer übermäßigen CPU-Auslastung aufgrund zu vieler TCP-Verbindungen auf.

Problembeschreibung

Unter Linux ist die CPU-Auslastung eines Tomcat-Webdienstes sehr hoch und liegt oben bei über 200 %. Auf die Anfrage konnte nicht geantwortet werden. Wiederholter Neustart, immer noch das gleiche Phänomen.

Fehlerbehebung

1. Prozessinformationen einholen

Der JVM-Prozess kann schnell über den von JDK bereitgestellten JPS-Befehl überprüft werden.

jps-pid

2. JStack-Informationen anzeigen

jstack pid

Es wurde festgestellt, dass sich eine große Anzahl von Log4j-Thread-Blöcken im Wartesperrzustand befindet

org.apache.log4j.Category.callAppenders(org.apache.log4j.spi.LoggingEvent) @bci=12, Zeile=201 (Kompilierter Frame)

Nach der Suche nach relevanten Informationen stellte ich fest, dass die Version 1.x von log4j ein Deadlock-Problem aufweist.

Ich habe das Problem gefunden, also habe ich die Log4j-Konfiguration angepasst, nur das Protokoll auf Fehlerebene aktiviert und Tomcat neu gestartet. Zu diesem Zeitpunkt verschwindet der Block-Thread im Stapel, aber die CPU-Auslastung des Prozesses ist immer noch hoch.

3. Weitere Untersuchungen

Um die CPU-Auslastung jedes Threads zu analysieren, müssen wir ein von einem großen Gott beigesteuertes Skript einführen, um die CPU-Auslastung jedes Threads im Java-Prozess zu berechnen.

#!/bin/bash

Satz oben = $ {1: -10}
setzen Sie pid=${2:-$(pgrep -u $USER java)}
setzen Sie tmp_file=/tmp/java_${pid}_$$.trace

$JAVA_HOME/bin/jstack $pid > $tmp_file
ps H -eo Benutzer, PID, PPID, TID, Zeit, % CPU --sort = % CPU --no-headers\
    | Schwanz -$oben\
    | awk -v "pid=$pid" '$2==pid{print $4"\t"$6}'\
    | während Zeile gelesen wird;
Tun
    setze nid=$(echo "$line"|awk '{printf("0x%x",$1)}')
    setze CPU = $ (echo "$line"|awk '{print $2}')
    awk -v "cpu=$cpu" '/nid='"$nid"'/,/^$/{print $0"\t"(isF++?"":"cpu="cpu"%");}' $tmp_file
Erledigt

rm -f $tmp_datei

Anwendungsbereich des Skripts

Da die %CPU-Statistiken in ps aus /proc/stat stammen, sind diese Daten nicht in Echtzeit, sondern hängen von der Häufigkeit der Betriebssystemaktualisierungen ab, die im Allgemeinen 1S beträgt. Aus diesem Grund stimmen die angezeigten Statistiken nicht mit den Informationen von jstack überein. Diese Informationen sind jedoch sehr hilfreich bei der Behebung von Problemen, die durch die kontinuierliche Belastung einiger Threads verursacht werden, da diese wenigen festen Threads weiterhin CPU-Ressourcen verbrauchen. Selbst wenn ein Zeitunterschied besteht, wird er trotzdem durch diese Threads verursacht.

Zusätzlich zu diesem Skript besteht eine einfachere Methode darin, die Prozess-ID herauszufinden und den folgenden Befehl zu verwenden, um die Ressourcennutzung jedes Threads im Prozess anzuzeigen

oben -H -p pid

Holen Sie sich hier die PID (Thread-ID), konvertieren Sie sie in einen Hexadezimalwert und suchen Sie dann die Thread-Informationen des Objekts in den Stapelinformationen.

Durch die obige Methode wird festgestellt, dass die kumulierte CPU-Auslastung der dem Tomcat-Prozess entsprechenden Threads etwa 80 % beträgt, was viel weniger ist als die von top angegebenen 200 %+.

Dies bedeutet, dass es keine Threads gibt, die die CPU längere Zeit beanspruchen, und dass viele kurzfristige CPU-intensive Berechnungen durchgeführt werden sollten. Ich vermutete dann, dass es an unzureichendem JVM-Speicher und häufigem GC lag.

jstat -gc pid

Es wurde festgestellt, dass die JVM-Speichernutzung nicht abnormal war, die Anzahl der GC-Vorgänge jedoch erheblich anstieg.

Da es sich um ein Netzwerkprogramm handelt, überprüfen Sie nach der Überprüfung des Speichers zusätzlich die Netzwerkverbindung.

4. Problemort

Beim Abfragen der TCP-Verbindung des entsprechenden Ports von Tomcat wird festgestellt, dass eine große Anzahl von EASTABLISH-Verbindungen und einige Verbindungen in anderen Zuständen vorhanden sind, insgesamt mehr als 400.

netstat -anp | grep-Port

Eine weitere Überprüfung der Quelle dieser Verbindungen ergab, dass es auf der Anwendungsseite des Tomcat-Dienstes eine große Anzahl von Hintergrund-Threads gab, die den Dienst häufig abfragten, was dazu führte, dass die Anzahl der Tomcat-Verbindungen des Dienstes erschöpft war und keine weiteren Anfragen mehr empfangen werden konnten.

Netstat-Statusbeschreibung:

  • LISTEN: Lauschen Sie auf Verbindungsanfragen von Remote-TCP-Ports
  • SYN-SENT: Verbindungsanfrage senden und auf passende Verbindungsanfrage warten (bei großer Anzahl solcher Statuspakete auf Infektion prüfen)
  • SYN-RECEIVED: Warten Sie nach dem Empfangen und Senden einer Verbindungsanforderung, bis die andere Partei die Verbindungsanforderung bestätigt (wenn dieser Status häufig auftritt, wird davon ausgegangen, dass er überflutet wurde).
  • ESTABLISHED: stellt eine offene Verbindung dar
  • FIN-WAIT-1: Warten auf eine Remote-TCP-Verbindungsunterbrechungsanforderung oder Bestätigung einer vorherigen Verbindungsunterbrechungsanforderung
  • FIN-WAIT-2: Warten auf eine Verbindungsunterbrechungsanforderung vom Remote-TCP
  • CLOSE-WAIT: Warten auf eine Verbindungsunterbrechungsanforderung von einem lokalen Benutzer
  • SCHLIESSEN: Wartet auf die Bestätigung des Remote-TCP, dass die Verbindung unterbrochen ist
  • LAST-ACK: Warten auf die Bestätigung der ursprünglichen Verbindungsunterbrechungsanforderung, die an den Remote-TCP gesendet wurde (keine gute Sache, wenn dieses Element angezeigt wird, prüfen Sie, ob es angegriffen wurde).
  • TIME-WAIT: Warten Sie lange genug, um sicherzustellen, dass der Remote-TCP eine Bestätigung der Verbindungsbeendigungsanforderung erhält.
  • GESCHLOSSEN: Kein Verbindungsstatus

5. Ursachenanalyse

Die direkte auslösende Ursache ist das Client-Polling, eine Anforderungsausnahme und fortgesetztes Polling; neue Hintergrund-Threads auf dem Client schließen sich weiterhin dem Polling-Team an, was letztendlich dazu führt, dass die Tomcat-Verbindung des Servers voll ist.

Dies ist das Ende dieses Artikels über die Aufzeichnung eines Problems der hohen CPU-Auslastung des Tomcat-Prozesses. Weitere verwandte Inhalte zur hohen CPU-Auslastung des Tomcat-Prozesses finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die folgenden verwandten Artikel weiter. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Eine praktische Aufzeichnung der Behebung von Paketierungsproblemen bei Spring-Projekten
  • j2Cache Online-Ausnahme Fehlerbehebung Problemlösung Datensatzanalyse

<<:  Detaillierte Diskussion über Speicher und Variablenspeicher in JS

>>:  Zwei Möglichkeiten zur manuellen Implementierung des MySQL-Hot-Standby mit zwei Maschinen auf dem Alibaba Cloud Server

Artikel empfehlen

Detaillierte Erläuterung des primitiven Datentyps Symbol in JavaScript

Inhaltsverzeichnis Einführung Beschreibung Namens...

Ideen und Codes zur Implementierung der Vuex-Datenpersistenz

Was ist Vuex vuex: ist ein speziell für vue.js en...

Tipps zur Optimierung von CSS-Schattenanimationen

Diese Technik stammt aus diesem Artikel - So anim...

So kapseln Sie die Tabellenkomponente von Vue Element

Beim Kapseln von Vue-Komponenten werde ich weiter...

MySQL-Inspektionsskript (unbedingt lesen)

Wie unten dargestellt: #!/usr/bin/env python3.5 p...

Verstehen Sie die anfängliche Verwendung von Redux in React in einem Artikel

Redux ist ein Plug-In zur Datenstatusverwaltung. ...

Detaillierte Einführung in den HTML-Head-Tag

Der HTML-Kopfteil enthält viele Tags und Elemente,...

Detaillierte Erläuterung der primitiven Werte und Referenzwerte in ECMAScript

Inhaltsverzeichnis Vorwort Was sind dynamische Ei...

So legen Sie ein Kennwort für MySQL Version 5.6 auf dem Mac fest

MySQL kann bei der Installation festgelegt werden...

So konfigurieren Sie WordPress mit Nginx

Zuvor hatte ich WordPress selbst erstellt, aber d...

CSS-Lösung zum Zentrieren von Elementen mit variabler Breite und Höhe

1. Horizontale Mitte Öffentlicher Code: html: <...

Lösung für den ES-Speicherüberlauf beim Starten von Docker

Fügen Sie die Datei jvm.options zur Elasticsearch...

Vue verwendet Mixins zur Optimierung von Komponenten

Inhaltsverzeichnis Mixins-Implementierung Zusamme...