Question

J'ai un Python démon en cours d'exécution dans la production. Elle emploie entre 7 et 120 fils. Récemment, l'instance la plus petite (7 fils) a commencé à montrer alors que tous les autres se bloque jamais montré cas ce genre de problème. Fixation strace au processus de python montre que tous les threads appellent FUTEX_WAIT_PRIVATE futex, ils tentent probablement quelque chose de verrouillage.

Comment qualifieriez-vous déboguer un tel problème?

Notez que ceci est un système de production en cours d'exécution de la mémoire flash, ce qu'écrit disque sont contraintes, aussi.

Était-ce utile?

La solution

L'observation était légèrement incorrecte. Un fil ne demande pas futex, mais au lieu échange tout en maintenant le gil. La machine en question est faible matériel ce swapping a très longtemps et semblait être une impasse. Le problème sous-jacent est une fuite de mémoire. : - (

Autres conseils

Cher Helmut, j'ai le même problème avec un fil suspendu sur FUTEXT_WAIT_PRIVATE.

Il semble que vous avez résolu le problème. Pouvez-vous partager plus d'informations sur la solution?

UPD:

La raison de la serrure a été finalement trouvé (au moins pour mon cas). Il est dû à verrouillage à l'importation en Python

Prenons situation suivante:

file1.py:

  

file2 import

file2.py:

  

créer le thread "thread2"

     

run "thread2"

     

attendre jusqu'à la fin de "thread2" avec une fonction (disons go go ())

     

def Go ():

     
    

un_module import

         

....

  

Ici, l'importation dans Go () raccrocherait puisque l'importation est verrouillé dans le thread principal (par fichier2 d'importation) qui ne sortira pas avant les finitions Go (). L'utilisateur verra à strace coup sur FUTEX_WAIT_PRIVATE.

Pour contourner ce lieu le code exécuté lors de l'importation de fichier2 en fonction Do () et l'exécuter après l'importation fichier2:

  

file2 import

     

file2.Do ()

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top