2012-06-04 22 views
6

Antecedentes:Python: ¿Cómo se puede encontrar el consumo de CPU para una pieza de código?

que tiene una aplicación de Django, funciona y responde bastante bien a baja carga, pero en alta carga como 100 usuarios/seg, que consume el 100% de la CPU y luego debido a la falta de CPU se ralentiza .

Problema:

  • perfilar la aplicación me da tiempo empleado por funciones.
  • Este tiempo aumenta en alta carga.
  • El tiempo consumido puede deberse a un cálculo complejo o a la espera de la CPU.

Entonces, ¿cómo encontrar los ciclos de CPU consumidos por un fragmento de código?

Dado que, reducir el consumo de CPU aumentará el tiempo de respuesta.

  • que podría haber escrito extremadamente código eficiente y necesita agregar más potencia de CPU

O

  • que podría tener algún código estúpida teniendo la CPU y causando la desaceleración?

¡Se agradece cualquier ayuda!

Actualización:

  • estoy usando Jmeter al perfil de mi aplicación web, me da un rendimiento de 2 peticiones/seg. [100 usuarios]
  • Obtengo un tiempo promedio de 36 segundos en 100 solicitudes frente a 1.25 segundos en una solicitud.

Más información

  • configuración de Nginx + Uwsgi con 4 trabajadores
  • Sin base de datos utilizada, usando una respuestas de una API REST
  • El primero golpeó la respuesta del API REST se almacena en caché , por lo tanto, no hace la diferencia.
  • Usando ujson para el análisis JSON.

curiosidad de saber:

  • Python Django es utilizado por muchos orgs para tantos sitios grandes, entonces tiene que haber algunas herramientas de análisis de depuración de memoria/CPU de gama alta.
  • Todos los que encontré fueron fragmentos de código ocasionales que realizan perfiles.
+0

Mi primer paso en la creación de perfiles es ver * qué función (s) * se usa la mayor parte del tiempo, y se investiga por qué, si está justificado, y si/cómo se puede reducir. La * cantidad * de tiempo (a menudo) no es tan importante como la * cantidad proporcional * de tiempo. –

+0

Todo el tiempo tomado parece estar distribuido en toda la aplicación. Ningún punto específico parece ser un área problemática. –

+1

¿Parece? ¿Hiciste mediciones exactas? Consulte http://stackoverflow.com/a/582337/851737 para obtener ayuda. – schlamar

Respuesta

2

usted podría intentar configurar su prueba de rampa ascendente lentamente, lo suficientemente lento como para que pueda ver la CPU aumente gradualmente y luego ejecutar el perfilador antes de llegar intensivo de la CPU. No tiene sentido intentar el código del perfil cuando la CPU está al máximo, porque en este punto todo será lento. De hecho, solo necesita una carga relativamente ligera para obtener datos útiles de un generador de perfiles.

Además, aumentando gradualmente la carga podrá ver mejor si hay un aumento gradual en la CPU (sugiriendo un cuello de botella en la CPU) o si hay un salto repentino en la CPU (sugiriendo otro tipo de problema, uno eso no necesariamente sería abordado por más CPU).

Intente utilizar algo así como un Temporizador de rendimiento de Cosntant para sincronizar las solicitudes, esto evitará que JMeter se deje llevar y sobrecargue el sistema.

+0

Un buen consejo para empezar ... Exploraré las opciones que sugirió. Además de eso, estoy buscando más una herramienta de creación de perfiles ninja para django/python: eso puede proporcionar una imagen más detallada del sistema. :) –

+0

gracioso esto está marcado pero recibe -1 .... geesh – user1012451

0

Pagar New Relic para algunos análisis bastante dulces, tienen logging específico de django.

Cuestiones relacionadas