2012-06-04 9 views
6

Background:Python: Come si fa a trovare il consumo di CPU per un pezzo di codice?

Ho un'applicazione Django, funziona e risponde abbastanza bene il basso carico, ma il carico elevato come 100 utenti/sec, che consuma 100% della CPU e poi a causa della mancanza di CPU rallenta .

Problema:

  • Profiling l'applicazione mi dà tempo impiegato dalle funzioni.
  • Questa volta aumenta il carico elevato.
  • Tempo consumato può essere dovuta a calcoli complessi o per l'attesa per la CPU.

quindi, come trovare i cicli della CPU consumati da un pezzo di codice?

Poiché, riducendo il consumo della CPU si aumenta il tempo di risposta.

  • avrei potuto scritto estremamente codice efficiente e la necessità di aggiungere più potenza della CPU

O

  • potrei avere qualche stupido codice prendendo la CPU e causando il rallentamento?

Ogni aiuto è apprezzato!

Aggiornamento:

  • Sto usando Jmeter per il profilo my webapp, mi dà un throughput di 2 richieste/sec. [100] utenti
  • ho un tempo medio di 36 secondi su 100 richiesta, in funzione del tempo di 1,25 secondi il 1 ° richiesta.

Ulteriori informazioni

  • configurazione Nginx + Uwsgi con 4 lavoratori
  • Nessun database servendosi di una risposta da un API REST
  • Il 1 ° ha colpito la risposta di API REST viene memorizzato nella cache , quindi non fa differenza.
  • Utilizzando ujson per JSON parsing.

curioso di sapere:

  • Python-Django è utilizzato da tanti org per tanti grandi siti, allora ci deve essere alcuni strumenti di analisi di debug/Memory-CPU di fascia alta.
  • Tutti quelli che ho trovato erano frammenti di codice casuali che eseguivano il profiling.
+0

Il mio primo passo nella profilatura è vedere * quale funzione (s) * trascorri la maggior parte del tempo, e indagano sul perché, se è giustificato, e se/come può essere ridotto. L'importo * del tempo (spesso) non è tanto importante quanto * l'importo proporzionale * del tempo. –

+0

Tutto il tempo impiegato sembra essere distribuito in tutta l'applicazione. Nessun punto specifico sembra essere un'area problematica. –

+1

Sembra? Hai misurazioni esatte? Vedi http://stackoverflow.com/a/582337/851737 per aiuto. – schlamar

risposta

2

Si potrebbe provare a configurare il test di rampa fino lentamente, abbastanza lento in modo da poter vedere la CPU aumentare gradualmente e quindi eseguire il profiler prima di colpire elevato della CPU. Non ha senso provare a scrivere il codice del profilo quando la CPU è al massimo, perché a questo punto tutto sarà lento. In realtà, hai solo bisogno di un carico relativamente leggero per ottenere dati utili da un profiler.

Inoltre, aumentando gradualmente il carico si sarà più in grado di vedere se c'è un aumento graduale della CPU (suggerendo un collo di bottiglia della CPU) o se c'è un improvviso salto della CPU (suggerendo forse un altro tipo di problema, uno questo non sarebbe necessariamente affrontato da più CPU).

Provare a utilizzare qualcosa come un temporizzatore di throughput Cosntant per soddisfare le richieste, questo impedirà a JMeter di essere portato via e di sovraccaricare il sistema.

+0

Buoni consigli per iniziare ... Esplorerò le opzioni suggerite. Oltre a questo, sto cercando più di uno strumento di profilazione ninja per django/python - Ciò può fornire un aspetto più granulare nel sistema. :) –

+0

divertente questo è spuntato ma riceve -1 .... geesh – user1012451

0

Checkout New Relic per alcune analisi piuttosto dolci, hanno una registrazione specifica per Django.

Problemi correlati