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
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:
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:
|
<<: Detaillierte Diskussion über Speicher und Variablenspeicher in JS
Inhaltsverzeichnis Einführung Beschreibung Namens...
Was ist Vuex vuex: ist ein speziell für vue.js en...
Diese Technik stammt aus diesem Artikel - So anim...
Beim Kapseln von Vue-Komponenten werde ich weiter...
Inhaltsverzeichnis Vorwort 1. Props, $emit Einweg...
Vorwort Als mein Team das Steuersystemmodul entwi...
Wie unten dargestellt: #!/usr/bin/env python3.5 p...
Redux ist ein Plug-In zur Datenstatusverwaltung. ...
Der HTML-Kopfteil enthält viele Tags und Elemente,...
Inhaltsverzeichnis Vorwort Was sind dynamische Ei...
MySQL kann bei der Installation festgelegt werden...
Zuvor hatte ich WordPress selbst erstellt, aber d...
1. Horizontale Mitte Öffentlicher Code: html: <...
Fügen Sie die Datei jvm.options zur Elasticsearch...
Inhaltsverzeichnis Mixins-Implementierung Zusamme...