Was ich getan habe, um Python-Speicher zu speichern

Hintergrund

Starten Sie mehrere Prozesse, die mehrere Tage dauern, auf einem kleinen Server mit 4 CPU-Speicher und 4 G. Als ich mit 100% CPU x 4 rechnete, ging mir in wenigen Stunden der Speicher aus. Die CPU-Auslastung ist stark gesunken. Anscheinend ging mir der Speicher aus.

Was ist passiert

Erhöhte Verarbeitungszeit Nitomonai, erhöhte Nutzung des Prozessspeichers → Speichererschöpfung → Speicherwechsel erfolgt → Die Speicherzugriffsgeschwindigkeit verschlechtert sich erheblich → Die CPU-Auslastung des wartenden Speichers beträgt 1% oder weniger → Es endet nie (signifikante Leistungsverschlechterung)

Maßnahme 0. Mit Geld gelöst

In den meisten Fällen wird das Problem gelöst, indem die Anzahl der Server erhöht oder die Leistung der Server verbessert wird. Ich habe es nicht ausgewählt, weil es ein persönlicher PJ war, aber als ich zu einem Server mit etwa 32 GB Speicher wechselte Ich frage mich, ob das die einzige Lösung war.

Gegenmaßnahme 1. Vertikale Aufteilung der Verarbeitung

Die Speicherverwaltung von Python erfolgt vollautomatisch und überlässt es der Basis-VM. Die einzige Lösung für den Speicherverlust besteht darin, den Prozess abzubrechen Wir haben die Teile, die 8 Arten von Kategorien verarbeiteten, mit einem Befehl geteilt, um die Verarbeitungsgleichheit zu gewährleisten.

Vor der Verbesserung

class Category(Enum):
    A = 1
    B = 2
    C = 3

for category in Category:
  benchmark(category)

Nach der Verbesserung

category = manage.get_category_by_priority()
benchmark(category)

Gegenmaßnahme 2. Vorgesetzter Supervisor

Der Code zur Verbesserung 1 musste in 8 Schritten ausgeführt werden, wenn der Prozess gestoppt wurde Es war notwendig, neu zu starten. In einem solchen Fall ist es zweckmäßig, einen Supervisor zu verwenden

shell


easy_install supervisor
echo_supervisord_conf > /etc/supervisord.conf
supervisord
supervisord status
alias sc='supervisorctl'
sc restart
sc reread
sc stop all
sc status
sc restart all

Gegenmaßnahme 3. Ich habe die manuelle GC in die Hände bekommen

Ich bin nicht mit Pythons GC vertraut, daher kann es Nebenwirkungen haben. Bisher wurde das Speicherleck behoben und es ist stabil. Es gibt die Möglichkeit von schwarzer Magie, daher kann ich es nicht sehr empfehlen.

Wenn Sie viel Klassencache verwenden, treten in der Python2-Serie häufig Speicherverluste auf. Wird python3 das Problem der stetig steigenden Speicheraufnahme lösen?

class Category(Enum):
    A = 1
    B = 2
    C = 3

for category in Category:
  benchmark(category)

def benchmark(category):
  bulk = []
  tmp_data = Tmp.get_all()
  for _tmp in tmp_data:
    bulk.append(calc(_tmp))
  DBTable.bulk_create(bulk)  #Bulk!

  #Speicherfreigabe
  import gc
  del tmp_data
  del bulk
  gc.collect()

Referenz: gc - Garbage Collector-Schnittstelle http://docs.python.jp/2/library/gc.html

Recommended Posts

Was ich getan habe, um Python-Speicher zu speichern
Was ich beim Update von Python 2.6 auf 2.7 gemacht habe
Was ich getan habe, um die Python2 EOL mit Zuversicht zu begrüßen
Was ich mit Python-Arrays gemacht habe
Was ich süchtig nach Python Autorun war
Was ich getan habe, als ich Python schneller machen wollte - Numba Edition -
[Bei Coder] Was ich getan habe, um den grünen Rang in Python zu erreichen
Was ich getan habe, um eine SSH-Verbindung zur VPS Ubuntu-Umgebung herzustellen
Was ich in Python gelernt habe
Wovon ich süchtig war, als ich Python Tornado benutzte
Was ich getan habe, um die String-Suchaufgabe zu beschleunigen
Wovon ich süchtig war, als der Processing-Benutzer zu Python wechselte
Ich habe versucht, Python zu berühren (Installation)
H29.2.27 ~ 3.5 Zusammenfassung meiner Arbeit
Ich möchte mit Python debuggen
Hat sich nicht von Python 2 auf 3 geändert
Was ich getan habe, um Anwendungsprotokolle in der GAE Flexible Environment auszugeben.
Beachten Sie, was Sie getan haben, um Flycheck mit Python zu verwenden
Wovon ich süchtig war, als ich ALE in Vim für Python einführte
Was ich mit json.dumps in Pythons base64-Codierung süchtig gemacht habe
Ich habe versucht, die Behandlung von Python-Ausnahmen zusammenzufassen
Ich habe versucht, PLSA in Python zu implementieren
Ich habe versucht, Permutation in Python zu implementieren
Ich habe Othello dazu gebracht, Kindern Python3 beizubringen (4)
Ich habe Python 3.5.1 installiert, um maschinelles Lernen zu studieren
Ich habe Othello dazu gebracht, Kindern Python3 beizubringen (2)
Ich habe versucht, PLSA in Python 2 zu implementieren
Ich möchte ein Glas aus Python verwenden
Ich wollte ABC160 mit Python lösen
Ich möchte eine Python-Umgebung erstellen
Funktion zum Speichern von Bildern nach Datum [python3]
Ich möchte Protokolle mit Python analysieren
Ich habe Othello dazu gebracht, Kindern Python3 beizubringen (5)
Ich habe versucht, ADALINE in Python zu implementieren
Was ich von Python Boot Camp bekommen habe
Ich wollte ABC159 mit Python lösen
Ich habe versucht, PPO in Python zu implementieren
[Python] Ich habe versucht, TF-IDF stetig zu berechnen
Ich habe ein Python-Datenanalysetraining aus der Ferne durchgeführt
Ich habe versucht, Python zu berühren (grundlegende Syntax)
Ich habe Othello dazu gebracht, Kindern Python3 beizubringen (3)
Ich wollte ABC172 mit Python lösen
Was ich getan habe, um die Luftfeuchtigkeit und Temperatur des Archivs zu verfolgen
Was soll ich verwenden, um Typvergleiche in Python durchzuführen?
Was ist ein Algorithmus? Einführung in den Suchalgorithmus] ~ Python ~
Auf Python 2.7.9 aktualisiert
Ich möchte Dunnetts Test in Python machen
Ich wollte den NOMURA Contest 2020 mit Python lösen
Ich möchte mich mit Schlüsselwortargumenten von Python merken
Python: Ich konnte in Lambda rekursieren
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich möchte mit Python ein Fenster erstellen
So implementieren Sie Shared Memory in Python (mmap.mmap)
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 1/3
Ich habe Python gestartet
Ich möchte ein Spiel mit Python machen
Ich habe Python ausprobiert! ] Heute Abschluss von "Jeder Python! Was ist Python!"!
Ich habe versucht zu erklären, wozu der Python-Generator so einfach wie möglich ist.
Ich wollte Python 3.4.3 mit Homebrew + pyenv installieren
Geschrieben "Einführung in die Effektüberprüfung" in Python