Hohe CPU-Auslastung in einem Datenerfassungsserver

Hohe CPU-Auslastung in einem Datenerfassungsserver

Ich habe ein kleines Python-Programm eingerichtet, das eine WebSocket-Verbindung verwendet, um Daten von einer API abzurufen und in eine PostgreSQL-Datenbank zu schreiben.

Es werden nur zwei (Benutzer-)Programme ausgeführt: die WebSocket-Verbindung, die Daten empfängt und in die Datenbank schreibt, und ein weiteres Programm, bei dem es sich im Wesentlichen um eine While-Schleife handelt, die alle 15 Sekunden ausgeführt wird und prüft, ob Daten geschrieben werden.

Beide Programme werden mit dem Supervisor als Daemon ausgeführt, und wenn 15 Sekunden lang keine Daten geschrieben werden, wird der Supervisor neu gestartet (um eine unterbrochene WebSocket-Verbindung zu verarbeiten).

Außerdem war ich (sehr) faul und habe Django ORM verwendet, um die Datenbankverbindung für mich herzustellen, anstatt psycopg2 direkt.

Es funktioniert, aber ich habe eine konstant hohe CPU-Last auf dem Server. Es ist ein 1CPU-1Gb-Speicherserver (AWS Micro). Der oberste Befehl gibt Folgendes aus:

top - 17:10:58 up 19 days, 15:03,  1 user,  load average: 1,57, 1,63,    1,58
Tasks: 116 total,   1 running, 115 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0,3 us,  0,3 sy,  0,0 ni,  0,0 id, 99,0 wa,  0,0 hi,  0,0 si,  0,3 st
 KiB Mem :  1014552 total,    63440 free,    86572 used,   864540 buff/cache
 KiB Swap:  1048572 total,   987380 free,    61192 used.   615096 avail Mem

Nun, das System ist langsam und stürzt gelegentlich ab.

Ich sehe, dass dies durch eine hohe IO-Last (99 wa) verursacht wird. Viele schlafende Prozesse. Aber ich schreibe durchschnittlich 400 MB pro Tag nur in die Datenbank.

Ich habe versucht, die Postgresql-Konfiguration gemäß der Dokumentation für eine hohe Schreiblast zu modifizieren und eine Auslagerungsspeicherdatei (1 GB) einzurichten, aber das hat nicht dazu beigetragen, die durchschnittliche Last zu verringern.

Als unerfahrener Benutzer wie ich weiß ich also nicht, ob ich mit dieser Belastung rechnen muss. Kann ich dieses Setup optimieren? Würde es sich verbessern, wenn ich Django ORM entferne und das Programm nur mit psycopg2 schreibe? Sollte ich eine andere Prüfmethode für unterbrochene WebSocket-Verbindungen verwenden? Gibt es eine Serverkonfiguration, die für diesen Bedarfsfall optimiert werden kann?

Danke!

Antwort1

Ich habe herausgefunden, wie ich das Problem mithilfe dieses Links beheben kann.http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/

Im Grunde habe ich es ausgeführt iotopund es wurde ausgegeben, welcher Prozess die hohe IO-Last verursacht hat. Dort habe ich herausgefunden, dass die Last auf das Lesen der Datenbank und nicht auf das Schreiben zurückzuführen war. Da wurde mir klar, dass ich etwas Dummes gemacht hatte: Ich habe die gesamte Datenbank häufig abgefragt, indem ich die Anzahl der Einträge gezählt und gleichzeitig überprüft habe, ob sie aufgezeichnet wurde. Das ergab eine durchschnittliche Lesegeschwindigkeit von 500 MB/s. Also habe ich den Code geändert, um die Primärschlüsselnummer des letzten Eintrags zu überprüfen, anstatt die Einträge zu zählen, und ... hat funktioniert. Die durchschnittliche Last beträgt jetzt 0,01. Danke @match für den Hinweis

verwandte Informationen