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.
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)
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.
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.
class Category(Enum):
A = 1
B = 2
C = 3
for category in Category:
benchmark(category)
category = manage.get_category_by_priority()
benchmark(category)
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
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