2017-06-15 4 views
0

Ich habe ein PyTorch-Skript mit 16 Prozessen. Es folgt ein Code-Schnipsel aus dem Hauptprozess:Python Child Prozess beenden unerwartet mit Exit-Code-

procs = [mp.Process(target=self.worker_wrapper, args=(i,)) for i in range(self.n_workers)] 
for p in procs: p.start() 
while True: 
    time.sleep(60) 
    for i, p in enumerate(procs): 
     self.logger.info('Check: id %d, exitcode %s, alive %s' % (
      i, str(p.exitcode), str(p.is_alive()))) 

die worker_wrapper ist dies:

def worker_wrapper(self, id): 
    try: 
     self.worker(id) 
    except Exception as e: 
     self.logger.info(e) 
     self.logger.error(traceback.format_exc()) 

Die worker wird noch einige Sachen tun und sollte nie aufhören. Es funktioniert gut am Anfang, aber in der Regel nach 1 Tag laufen, einige untergeordnete Prozesse (nicht alle) unerwartet beendet, bekomme ich die Ausgabe wie folgt aus:

[2017-06-15 08:45:21,540] Check: id 13, exitcode -9, alive False 

Und es fanden keine Ausnahme abfangen. Ich habe versucht, den Exitcode -9 zu suchen, habe aber nichts Nützliches bekommen. Passiert das schon mal jemand? Oder haben Sie eine Idee, wie Sie dies debuggen können? Es tut mir leid, dass ich kein minimales reproduzierbares Code-Snippet bereitstellen kann, da es normalerweise einen Tag dauert, um es zu reproduzieren. Und ich benutze Python2.7

Antwort

1

Exit -9 bedeutet, dass der Prozess über SIGKILL getötet wurde.

Es liegt wahrscheinlich daran, dass auf Ihrem Computer nicht genügend Arbeitsspeicher verfügbar ist und der Betriebssystemkern den OOM-Killer auslöst.

Um dies zu überprüfen, überprüfen Sie die Kernel-Protokolle über dmesg Sie sollten die OOM Killer für Ihre Worker-Prozesse.

Sie müssen den Speicherbedarf Ihrer Anwendung reduzieren (oder den Arbeitsspeicher Ihres Servers/Ihrer Arbeitsstation erhöhen). Stellen Sie außerdem sicher, dass die Anwendung keinen Speicherverlust aufweist.

+0

Sie haben Recht! Ich habe festgestellt, dass OOM meinen Prozess getötet hat! –

Verwandte Themen