Detaillierte Erläuterung der Ideen zur Leistungsüberwachung bestimmter Prozesse im Linux-System basierend auf Python

Detaillierte Erläuterung der Ideen zur Leistungsüberwachung bestimmter Prozesse im Linux-System basierend auf Python

Es gibt viele Tools, Komponenten und Programme zur Überwachung von Linux-Servern im Internet, aber auf einem Server laufen viele Prozesse gleichzeitig. Insbesondere bei Leistungstests können mehrere Dienste auf einem Server bereitgestellt werden. Wenn Sie nur die CPU und den Speicher des gesamten Servers überwachen, können Sie Leistungsprobleme eines Dienstes nicht effektiv und genau lokalisieren (dies kann natürlich auch mit anderen Tools erreicht werden). Daher ist es notwendig, nur bestimmte Prozesse zu überwachen. Die Anforderungen waren klar, also begann ich, ein Skript zur Leistungsüberwachung zu schreiben.

1. Allgemeines Denken

1. Um die Überwachung bequem zu starten und zu stoppen und die Überwachungsergebnisse jederzeit anzuzeigen, wenn Sie die Überwachungsergebnisse anzeigen möchten, wird ein Dienst mit Flask gestartet. Durch Senden einer Get-Anforderung können Sie die Überwachung jederzeit starten und stoppen und die Überwachungsergebnisse anzeigen.
2. Um zu steuern, ob CPU, Speicher und IO überwacht werden sollen, aktivieren Sie die Multithread-Überwachung.
3. Um die Abhängigkeit von anderen Komponenten zu reduzieren, werden die Überwachungsergebnisse in ein Protokoll geschrieben.
4. Um die Anzeige der Überwachungsergebnisse zu erleichtern, werden die Ergebnisse direkt im HTML-Format zurückgegeben.

Bildbeschreibung hier einfügen

2. Konfigurationsdatei

config.py

IP = '127.0.0.1'
PORT = '5555'
LEVEL = 'INFO' # Protokollebene
BACKUP_COUNT = 9 # Protokollsicherungszähler
LOG_PATH = 'logs' # Protokollpfad
INTERVALL = 1 # Intervall, Befehlsintervall ausführen.
SLEEPTIME = 3 # Intervall, wenn der Monitor gestoppt wird, Abfrage zum Starten des Monitors, wenn die Bedingung erfüllt ist.
ERROR_TIMES = 5 # Mal, Anzahl der ausgeführten Befehle. Wenn gleich, wird der Monitor automatisch gestoppt.
IS_JVM_ALERT = True # Gibt an, ob eine Warnung ausgegeben werden soll, wenn die Häufigkeit der vollständigen GC zu hoch ist.
IS_MONITOR_SYSTEM = True # Gibt an, ob die CPU und der Speicher des Systems überwacht werden sollen.
IS_MEM_ALERT = True # Gibt an, ob eine Warnung ausgegeben werden soll, wenn der Arbeitsspeicher zu niedrig ist. Die Warnung erfolgt per E-Mail.
MIN_MEM = 2 # Minxium-Speicher, uint: G
# 0: Cache nicht leeren, 1: Seiten-Cache löschen, 2: Dentries- und Inodes-Cache löschen, 3: 1 und 2 einschließen;
# echo 1 >/proc/sys/vm/drop_caches
ECHO = 0
SMTP_SERVER = 'smtp.sina.com' # SMTP-Server
SENDER_NAME = 'Absendername' # Name des Absenders
SENDER_EMAIL = '[email protected]' # E-Mail des Absenders
PASSWORT = 'UjBWYVJFZE9RbFpIV1QwOVBUMDlQUT09' # E-Mail-Passwort, Base64-kodiert.
RECEIVER_NAME = 'baidu_all' # Empfängername
RECEIVER_EMAIL = ['[email protected]', '[email protected]'] # E-Mail des Empfängers
DISK = 'device1' # Auf welcher Festplatte Ihre Anwendung läuft
START_TIME = 'startTime.txt' # Speichert die Startzeit der Überwachung.
FGC_TIMES = 'FullGC.txt' # Speichert die Zeit jedes FullGC-Zeitpunkts.
#html
HTML = '<html><body>{}</body><html>'
FEHLER = '<p style="color:red">{}</p>'
HEADER = '<div id="header"><h2 align="center">Leistungsmonitor (pid={})</h2></div>'
ANALYSE = '<div id="container" style="width:730px; margin:0 auto">{}</div>'

IP und PORT: Die Server-IP und der Port, auf denen der Dienst aktiviert ist. Sie müssen sich auf demselben Server befinden wie der überwachte Dienst.
BACKUP_COUNT: Der Standardwert ist 9, was bedeutet, dass nur die Überwachungsergebnisse der letzten 9 Tage beibehalten werden;
INTERVALL: Das Zeitintervall zwischen zwei Überwachungen. Der Standardwert ist 1 s. Es wird hauptsächlich für die CPU- und Speicherüberwachung verwendet. Wenn Sie mehrere Ports oder Prozesse gleichzeitig überwachen, stellen Sie diesen Wert bitte auf einen kleineren Wert ein.
ERROR_TIMES: Die Anzahl der fehlgeschlagenen Befehlsausführungen. Wenn die Zahl größer ist, wird die Überwachung automatisch beendet. Wird hauptsächlich verwendet, um einen bestimmten Prozess zu überwachen. Wenn der Prozess beendet wird, muss die Überwachung automatisch beendet werden und muss manuell ausgelöst werden, um die Überwachung erneut zu starten. Wenn ein bestimmter Port überwacht wird, wird die Überwachung auch beendet, wenn der Prozess des Ports beendet wird. Wenn der Port neu gestartet wird, wird die Überwachung automatisch gestartet.
IS_JVM_ALERT: nur für Java-Anwendungen, wenn FullGC häufig ist, wird eine E-Mail-Erinnerung gesendet; bei allgemeinen Leistungstests sollte die Häufigkeit von FullGC nicht weniger als 3600 Sekunden betragen;
IS_MONITOR_SYSTEM: Ob die gesamte CPU-Auslastung und der verbleibende Speicher des Systems überwacht werden sollen;
IS_MEM_ALERT: ob eine E-Mail-Erinnerung gesendet werden soll, wenn der verbleibende Arbeitsspeicher des Systems zu niedrig ist;
MIN_MEM: Der vom System zugelassene Mindestrestspeicher in GB;
ECHO: Gibt an, ob der Cache freigegeben werden soll, wenn der verbleibende Systemspeicher zu gering ist. 0 bedeutet, nicht freizugeben, 1 bedeutet, den Seitencache freizugeben, 2 bedeutet, den Dentries- und Inodes-Cache freizugeben, und 3 bedeutet, 1 und 2 freizugeben.
DISK: Datenträgernummer. Wenn Sie IO überwachen, müssen Sie die Datenträgernummer eingeben und mit df -h Dateiname prüfen, auf welchem ​​Datenträger die aktuelle Datei gemountet ist.
START_TIME: zeichnet die Zeit auf, zu der der Start jeder Überwachung manuell ausgelöst wird;
FGC_TIMES: zeichnet die Zeit jedes FullGC zur Fehlerbehebung auf;

3. Schnittstellen und Dienste

server.py

Server = Flask(__name__)
permon = PerMon()
# Multithreading aktivieren t = [threading.Thread(target=permon.write_cpu_mem, args=()),
 threading.Thread(Ziel=permon.write_io, Argumente=())]
für i im Bereich (Länge (t)):
 t[i].start()
# Überwachung starten# http://127.0.0.1:5555/runMonitor?isRun=1&type=pid&num=23121&totalTime=3600
@server.route('/runMonitor', Methoden=['get'])
def runMonitor():......
# Zeichnen Sie das Diagramm mit den Überwachungsergebnissen# http://127.0.0.1:5555/plotMonitor?type=pid&num=23121
@server.route('/plotMonitor', Methoden=['get'])
def plotMonitor():.......
server.run(port=cfg.PORT, debug=True, host=cfg.IP) # Starten Sie den Dienst

Durch Eingabe der entsprechenden URL in die Adressleiste des Browsers können Sie die Überwachung starten und stoppen sowie die Überwachungsergebnisse anzeigen.

URL-Parameterübergabe:

1. Beginnen Sie mit der Überwachung

http://127.0.0.1:5555/runMonitor?isRun=1&type=pid&num=23121&totalTime=3600
isRun: 1 bedeutet Überwachung starten, 0 bedeutet Überwachung stoppen;
Typ und Nummer: Typ = PID gibt an, dass Nummer die Prozessnummer ist, Typ = Port gibt an, dass Nummer die Portnummer ist. Mehrere Ports oder Prozesse können gleichzeitig überwacht werden, und mehrere Ports oder Prozesse werden durch englische Kommas getrennt.
totalTime: die gesamte Überwachungszeit in Sekunden. Wenn totalTime nicht übergeben wird, überwacht das System standardmäßig die ganze Zeit.

2. Überwachungsergebnisse anzeigen

http://127.0.0.1:
5555/PlotMonitor?Typ=Port&Num=23121&System=1&Startzeit=2019-08-03 08:08:08&Dauer=3600
Typ und Nummer: Typ=PID gibt an, dass Nummer die Prozessnummer ist, Typ=Port gibt an, dass Nummer die Portnummer ist;
System: Gibt an, dass die Ergebnisse der Systemüberwachung überprüft werden sollen. Wenn Typ und Nummer übergeben werden, können unabhängig davon, ob System übergeben wird oder nicht, nur die Ergebnisse der Prozessüberwachung angezeigt werden. Wenn Typ und Nummer nicht übergeben werden und nur System übergeben wird, können die Ergebnisse der Systemüberwachung angezeigt werden.
startTime: Überprüfen Sie die Startzeit der Überwachungsergebnisse.
Dauer: die Dauer für die Anzeige der Überwachungsergebnisse in Sekunden;
Wenn startTime und duration nicht übergeben werden, werden standardmäßig alle Ergebnisse seit dem letzten Start der Überwachung angezeigt. Wenn Sie Überwachungsergebnisse innerhalb eines bestimmten Zeitraums anzeigen müssen, müssen startTime und duration übergeben werden. Der Zeitbereich zum Anzeigen der Überwachungsergebnisse reicht von startTime bis startTime+duration.
Hinweis: Wenn der Dienst innerhalb eines Zeitraums neu gestartet wird, in dem Sie die Überwachungsergebnisse anzeigen, ändert sich die Prozessnummer. Wenn Sie vor dem Neustart noch die Prozessnummer eingeben, können Sie die Überwachungsergebnisse der entsprechenden Prozessnummer nur innerhalb des entsprechenden Zeitraums anzeigen. Im Allgemeinen lässt sich die Portnummer nicht so leicht ändern. Es wird empfohlen, die Portnummer beim Anzeigen der Überwachungsergebnisse einzugeben.

4. Überwachung

performance_monitor.py

Verwenden Sie den Befehl top, um CPU und Speicher zu überwachen, verwenden Sie den Befehl jstat, um den JVM-Speicher zu überwachen (nur Java-Anwendungen), verwenden Sie den Befehl iotop, um den Prozess beim Lesen und Schreiben von Datenträgern zu überwachen, verwenden Sie den Befehl iostat, um die Datenträger-E/A zu überwachen, verwenden Sie den Befehl netstat, um den Prozess basierend auf dem Port zu überprüfen, und verwenden Sie den Befehl ps, um die Startzeit des Dienstes anzuzeigen. Daher muss der Server die oben genannten Befehle unterstützen. Wenn nicht, installieren Sie sie bitte.

Hinweis: Da ein Prozess mehrere Threads starten kann, können Sie beim Anzeigen der IO des Prozesses keine IO sehen. Sie können zwar die IO eines vom Prozess gestarteten Threads sehen, die IO ist jedoch sichtbar, der Thread ändert sich jedoch ständig. Daher wird die Überwachung der IO eines angegebenen Prozesses derzeit nicht unterstützt.

5. Überwachungsergebnisse anzeigen

draw_performance.py

1. Zeichnen Sie jeweils das CPU-Diagramm, das Speicher- und JVM-Diagramm, das IO-Diagramm und das Handle-Anzahl-Diagramm.
2. Berechnen Sie Perzentile, um Statistiken zur CPU- und IO-Auslastung zu erstellen.
3. Um die Statistik der Garbage Collection-Informationen zu erleichtern, berechnen Sie YGC, FGC und die jeweiligen Häufigkeiten von Java-Anwendungen.

Die Ergebnisse des Monitorings lauten wie folgt:

Bildbeschreibung hier einfügen

6. Erweiterungsfunktionen

extern.py hat zwei Funktionen

1. Hafentransferprozess

versuchen:
 Ergebnis = os.popen(f'netstat -nlp|grep {port} |tr -s " "').readlines()
 res = [line.strip() für Zeile im Ergebnis, wenn str(Port) in Zeile]
 p = res[0].split(' ')
 pp = p[3].split(':')[-1]
 wenn str(port) == pp:
 pid = p[-1].split('/')[0]
außer Ausnahme als Fehler:
 logger.logger.error(err)

2. Suchen Sie das Protokoll mit den Überwachungsergebnissen

Allgemeine Idee:

(1) Suchen Sie anhand der eingegebenen Start- und Endzeit alle Protokolldateien, die diesen Zeitraum umfassen.
(2) Suchen Sie anhand der gefundenen Protokolldateien nach allen Protokollen, die Überwachungsergebnisse enthalten.
(3) Beim Zeichnen des Graphen werden alle gefundenen Protokolle durchlaufen.

Auffüllen

1. Um die Anzeige der aktuellsten Überwachungsstartzeit zu erleichtern, wird jede Überwachungsstartzeit in die Datei startTime.txt geschrieben.

2. Um die Fehlerbehebung bei möglichen Problemen in Java-Anwendungen zu erleichtern, schreiben Sie die Zeit jedes Full GC in die Datei FullGC.txt.

Projektadresse: https://github.com/leeyoshinari/performance_monitor

Zusammenfassen

Oben ist die vom Herausgeber eingeführte, auf Python basierende Überwachung der Leistung von Linux-Systemen angegebener Prozesse. Ich hoffe, dass sie für alle hilfreich sein wird. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Herausgeber wird Ihnen rechtzeitig antworten. Ich möchte auch allen für ihre Unterstützung der Website 123WORDPRESS.COM danken!
Wenn Sie diesen Artikel hilfreich finden, können Sie ihn gerne abdrucken und dabei bitte die Quelle angeben. Vielen Dank!

Das könnte Sie auch interessieren:
  • Eine kurze Einführung in Linux-Leistungsüberwachungsbefehle kostenlos
  • PHP+Swoole+Linux zur Realisierung eines Betriebsbeispiels für Systemüberwachung und Leistungsoptimierung
  • Detaillierte Erläuterung zur Verwendung des Top-Befehls zur Analyse der Linux-Systemleistung
  • Detaillierte Erläuterung der Befehle zum Status und zur Leistung des Linux-Servers
  • Detaillierte Erläuterung des Linux-Leistungstestbefehls pmap
  • 20 Tipps zur Leistungsoptimierung von Linux-Servern, die es wert sind, gesammelt zu werden
  • Tutorial zur Verwendung von http_load, einem Stresstest-Tool für die Web-Performance, unter Linux
  • Vier Möglichkeiten zur Webdatensynchronisierung unter Linux (Leistungsvergleich)
  • Linux+Nginx+Php zum Erstellen eines leistungsstarken WEB-Servers
  • Tutorial-Analyse zur Installation und Nutzung des Linux-Leistungsüberwachungstools nmon

<<:  Lösung zum automatischen Auslösen von Klickereignissen beim Klicken auf ein Popup-Fenster in Vue (Simulationsszenario)

>>:  Das Prinzip und die Anwendung der ES6-Dekonstruktionszuweisung

Artikel empfehlen

Aktivieren oder Deaktivieren des GTID-Modus in MySQL online

Inhaltsverzeichnis Grundlegende Übersicht GTID on...

Detaillierte Schritte zur Installation von Nginx unter Linux

1. Nginx-Installationsschritte 1.1 Offizielle Web...

Detailliertes Tutorial zur automatischen Installation von CentOS7.6 mit PXE

1. Nachfrage Die Basis verfügt über 300 neue Serv...

Eine detaillierte Diskussion der Komponenten in Vue

Inhaltsverzeichnis 1. Komponentenregistrierung 2....

Regeln für die Verwendung gemeinsamer MySQL-Indizes

Ein gemeinsamer Index wird auch als zusammengeset...

WeChat-Applet-Picker - Mehrspalten-Selektor (Modus = MultiSelector)

Inhaltsverzeichnis 1. Wirkungsdiagramm (mehrere S...

Zwei Möglichkeiten zum Einführen von SVG-Symbolen in Vue

So führen Sie SVG-Symbole in Vue ein Methode 1 zu...

Prozessdiagramm für das erste Bereitstellungs-Webprojekt von Tomcat

Legen Sie Ihr eigenes Webprojekt im Verzeichnis w...

Detaillierte Erklärung der Lösung für verweigerte Berechtigungen in Linux

Zugriff verweigert: Der Grund hierfür ist: Es lie...

Detaillierte Erklärung von Promises in JavaScript

Inhaltsverzeichnis Grundlegende Verwendung von Pr...