2017-06-15 1 views
0

J'ai un script PyTorch avec 16 processus. Voici un extrait de code du processus principal:Le processus enfant python se ferme de façon inattendue avec le code de sortie -9

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()))) 

le worker_wrapper est la suivante:

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

Le worker fera des choses et ne devrait jamais arrêter. Il fonctionne bien au début, mais généralement après 1 jour en cours d'exécution, certains processus enfants (pas tous) de sortie de façon inattendue, je reçois la sortie comme ceci:

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

Et il n'a pas pris aucune exception. J'ai essayé de chercher exitcode -9 mais je n'ai rien trouvé d'utile. Est-ce que quelqu'un rencontre cela avant? Ou avez-vous une idée sur la façon de déboguer cela? Je suis désolé de ne pas pouvoir fournir un extrait de code minimal reproductible, car il faut généralement un jour pour qu'il se reproduise. Et j'utilise python2.7

Répondre

1

Le code de sortie -9 signifie que le processus a été tué via SIGKILL. Il est probablement dû à un manque de mémoire de votre machine et le noyau OS a déclenché le tueur OOM.

Pour vérifier cela, consultez les journaux du noyau via dmesg vous devriez remarquer le tueur OOM ciblant vos processus de travail.

Vous devez réduire l'empreinte mémoire de votre application (ou augmenter la mémoire de votre serveur/station de travail). Vérifiez également que votre application ne fuit pas la mémoire.

+0

Vous avez raison! J'ai trouvé que l'OOM a tué mon processus! –