2011-09-19 7 views
5

Come posso vedere nel programma di utilità topcelery consuma molto tempo CPU. Quindi voglio delinearlo.Attività di profilatura di Celery

posso farlo manualmente sulla macchina di sviluppo in questo modo:

python -m cProfile -o test-`date +%Y-%m-%d-%T`.prof ./manage.py celeryd -B 

Ma per avere tempi precisi ho bisogno di profilo sulla macchina di produzione. Su quella macchina (Fedora 14) il sedano viene lanciato dagli script di init. Per esempio.

service celeryd start 

ho capito questi script alla fine chiamano manage.py celeryd_multi alla fine. Quindi la mia domanda è: come posso dire a celeryd_multi di avviare il sedano con il profilo abilitato? Nel mio caso questo significa aggiungere -m cProfile -o out.prof opzioni a python.

Qualsiasi aiuto è molto apprezzato.

risposta

12

Penso che tu stia confondendo due problemi separati. Potresti elaborare troppe singole attività o un singolo compito potrebbe essere inefficiente.

Si può sapere quale di questi è il problema, ma non è chiaro dalla tua domanda quale sia.

Per tenere traccia di quante attività vengono elaborate, suggerisco di guardare a celerymon. Se un compito particolare appare più spesso che ti aspetti, puoi indagare da dove viene chiamato.

Probabilmente non è utile profilare l'intero contenuto di sedano in quanto otterrete un sacco di codice su cui non avete alcun controllo. Come dici tu, significa anche che hai un problema nell'esecuzione in produzione. Ti suggerisco di aggiungere lo profiling code direttamente alla definizione del tuo compito.

È possibile utilizzare cProfile.run('func()') come livello di riferimento indiretto tra il sedano e il codice in modo che ogni esecuzione dell'attività sia profilata. Se si genera un nome file univoco e lo si passa come secondo parametro a run, si disporrà di una directory completa di dati profilo che è possibile esaminare in base alle attività, oppure utilizzare pstats.add per combinare più sessioni di attività.

Infine, il profilo per-attività significa che è possibile attivare o disattivare il profiling utilizzando un'impostazione nel codice del progetto sia globalmente che per attività, piuttosto che dover modificare gli script di inizializzazione sul server.

+0

'celerymon' non viene aggiornato ora. – harukaeru