Frage

Ich habe eine Python-Daemon in der laufenden Produktion. Es beschäftigt zwischen 7 und 120 Fäden. Vor kurzem hat die kleinste Instanz (7 Threads) gestartet hängt zu zeigen, während alle anderen Instanzen nie diese Art von Problem zeigte. Anbringen Strace den Python-Prozess zeigt, dass alle Fäden futex FUTEX_WAIT_PRIVATE anrufen, so dass sie wahrscheinlich zu Schloss etwas versuchen.

Wie würden Sie ein solches Problem debuggen?

Beachten Sie, dass dies ein Produktionssystem ist aus dem Flash-Speicher ausgeführt wird, so Platte schreibt beschränkt sind, auch.

War es hilfreich?

Lösung

Die Beobachtung war etwas falsch. Ein Thread wurde nicht Aufruf futex, sondern tauschen, während die gil halten. Da die Maschine in Frage niedrige Hardware nahm dieser Swapping sehr lang und schien eine Sackgasse zu sein. Das zugrunde liegende Problem ist ein Speicherleck. : - (

Andere Tipps

Lieber Helmut, sie hat das gleiche Problem mit einem Faden hängen FUTEXT_WAIT_PRIVATE.

Es scheint, dass Sie das Problem gelöst haben. Können Sie weitere Informationen über die Lösung teilen?

UPD:

Der Grund für die Sperre schließlich gefunden wurde (zumindest für meinen Fall.): Es Importsperre in Python zurückzuführen

Betrachten Sie folgende Situation vor:

file1.py:

  

Import file2

file2.py:

  

erstellen thread "thread2"

     

run "thread2"

     

Warten, bis "thread2" Finish mit einigen Funktion (sagen wir mal gehen Go ())

     

def Go ():

     
    

Import some_module

         

....

  

Hier ist der Import in Go () auflegen würde, da der Import im Hauptthread gesperrt ist (durch Import file2), die nicht bis zum Go () beendet veröffentlicht wird. Der Benutzer wird in Strace hängt auf FUTEX_WAIT_PRIVATE sehen.

, diesen Ort zu arbeiten, um den Code während des Imports von Datei2 in Do ausgeführt () Funktion und führen Sie es nach dem Import file2:

  

Import file2

     

file2.Do ()

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top