si blocca in Python chiamate futex
-
29-09-2019 - |
Domanda
Ho un Python daemon in esecuzione in produzione. Impiega tra 7 e 120 fili. Recentemente il più piccolo istanza (7 fili) ha iniziato a mostrare si blocca, mentre tutti gli altri casi non hanno mostrato questo tipo di problema. Collegamento strace agli spettacoli di processo python che tutte le discussioni stanno chiamando futex FUTEX_WAIT_PRIVATE, in modo che siano probabilmente cercando di blocco qualcosa.
Come si eseguire il debug di un tale problema?
Si noti che questo è un sistema di produzione che va dalla memoria flash, in modo da scritture su disco sono limitate, anche.
Soluzione
L'osservazione è stata leggermente corretta. Un thread non stava chiamando futex, ma invece scambiando mentre si tiene la gil. Dal momento che la macchina in questione è basso hardware questo scambio ha preso molto a lungo e sembrava essere una situazione di stallo. Il problema alla base è una perdita di memoria. : - (
Altri suggerimenti
Caro Helmut, ho lo stesso problema con uno appeso filo su FUTEXT_WAIT_PRIVATE.
Sembra che tu abbia risolto il problema. Puoi condividere ulteriori informazioni sulla soluzione?
UPD:
Il motivo del blocco è stato finalmente trovato (almeno per il mio caso):. Esso è dovuto a blocco import in Python
Si consideri seguente situazione:
file1.py:
import file2
file2.py:
creare thread "Thread2"
eseguire "Thread2"
attendere fino a completare "Thread2" con qualche funzione (diciamo Go Go ())
def Go ():
import qualche_modulo
....
Qui l'importazione in Go () sarebbe riagganciare in quanto l'importazione è bloccata nel thread principale (con l'importazione file2) che non sarà rilasciato fino Go) finiture (. L'utente vedrà in strace Aspetta FUTEX_WAIT_PRIVATE.
Per risolvere questo posto il codice eseguito durante l'importazione di file2 in funzione Do () ed eseguirlo dopo file2 importazione:
import file2
file2.Do ()