2011-12-01 10 views
26

Quería probar python27 en appengine, así que he migrado mi aplicación desde python25. ¡El rendimiento obtuvo más de 2 veces más lento por cada solicitud! Luego volví a Python25 y el rendimiento vuelve a ser como antes. Aquí está una foto:Appengine, degradación del rendimiento con python27

enter image description here (milisegundos/petición) (CGI manejador pitón 27, entonces Python25)

Mi aplicación utiliza Werkzeug, Jinja2 y Memcache se utiliza bastante pesada. ¿Qué razones pueden causar una disminución tan dramática en el rendimiento? ¿O es solo porque python2.7 en appengine todavía está en beta?

Algunos detalles acerca de la aplicación:

es bastante simple tienda online. Hay algunas tareas diferidas con generación de pdf, sin embargo, esto no afecta mucho al gráfico en general, ya que la página principal recibe la mayoría de los resultados. Casi todo está memcached. Se tarda hasta ~ 0,8 segundos con la memoria caché vacía para cargar una página con Python 2.5. Las páginas no almacenadas en caché tardan en cargarse principalmente porque hay muchas consultas de db. Las páginas en caché se cargan en 60 ~ 100 ms. El tiempo de carga promedio es ~ 150 ms. Con el rendimiento de Python 2.7 es terrible. Las páginas que no están en la memoria caché tardan más de 2 segundos en cargarse. Las páginas en caché se cargan en más de 200 ms.

Lamentablemente no tengo ningún perfil de datos y no puedo decir qué es exactamente lo que ralentiza las cosas en Python 2.7.

Mis números para el tiempo de carga de la página se recopilan de la página en vivo que sirve ~ 10 req/seg y 1 instancia residente de python25 se ocupa fácilmente de esta carga.

También he probado python 2.7 con wsgi y threadsafe:yes, pero el rendimiento mejoró un poco en comparación con python 2.7 y cgi.

+0

no tengo cualquier idea de por qué sería tan lento, pero podrían estar probando sacar un montón de cosas ya que python27 todavía es experimental en el motor de aplicaciones. – bigblind

+1

No nos ha dicho nada sobre su aplicación ni sobre lo que hace, ni sobre los pasos que ha dado para diagnosticar. ¿Cómo podríamos saber cuál podría ser el problema? –

+0

estoy viendo lo mismo. Uno de los cuellos de botella que identifiqué fue que las llamadas a API de Memcache fueron más lentas en cuanto a las solicitudes que estaba evaluando, pero no me sorprendería si fuera por cada llamada de API. –

Respuesta

16

Somewhere on Usenet He leído una declaración como esta de Google "el tiempo de ejecución de Python 2.7 es más lento que el tiempo de ejecución de Python 2.5 en algunos casos y más rápido en otros. No estamos publicitando las razones por las que en este momento". Parece que nadie ha encontrado hasta ahora un escenario en el 2.7 es más rápido que el 2.5 por lo tanto ...

leí en este

  1. Google es consciente de un problema preformace.
  2. No están seguros de cómo manejarlo.

Mi perfil indica que las aplicaciones multihilo de python 2.7 gastan aprox. 35% de su tiempo en {method 'acquire' of 'thread.lock' objects} - y aparentemente eso sucede en el código de Google RPC. También hay indicios de que importar tiene graves problemas de bloqueo.

Básicamente no puede hacer nada al respecto excepto esperar a que AppEngine lo arregle. Consulte también this comprehensive documentation sobre la ralentización.

Los factores que es casi seguro que no juegan un papel importante en esto son:

  • subir archivos pyc (GAE la infraestructura lo hace por usted)
  • el aprovisionamiento de servidores (GAE es una escala tan masiva e incluso en beta cerrada 2.7. fue lento)
  • WSGI vs CGI (no explicaría un enorme impacto en el rendimiento tales)

lo feo es que Google hizo una caminata masiva de precios en tw o pasos, pero nos dijo "al usar multiproceso de pitón 2.7 puede ejecutar mucho más eficaz que los nuevos precios no se ven tan mal". Lamentablemente, el Python 2.7. el tiempo de ejecución aún está etiquetado como "experimental" y no ofrece un rendimiento de calidad de producción.

+0

Ahora leo varios "No estamos publicando los motivos de los problemas de velocidad" comentarios por el personal de AppEngine. Así que realmente parece haber algún problema fundamental. – max

+1

Gracias mdorseif: he encontrado que {method 'acquire' de 'thread.lock' objects} ocupa hasta el 50% del tiempo en algunas de mis llamadas en GAE ... 6 meses después y esto todavía parece ser un problema (a pesar de que 2.7 ya no es experimental). ¿Alguien ha escuchado alguna actualización de Google sobre esto? Además, mencionas que hay indicios de que la importación tiene serios problemas de bloqueo, ¿hay algo que los desarrolladores puedan hacer al respecto al experimentar este problema? – Stin

+0

La documentación vinculada en esta respuesta indica que Google implementó una solución el 28 de enero de 12 y que el problema ya no existe. –

-1

Por lo que sé, Python 2.7 debería ser más rápido que 2.5. Sin embargo, hay algunos factores que pueden influir en las velocidades:

  • La forma en que se compila el binario;
  • Si sus bibliotecas (como Memcache) están compiladas como C (++) o Python. Un módulo de C++ es, por supuesto, más rápido que el equivalente de Python;
  • El servidor en el que se encuentra: nunca utilicé App Engine pero supongo que un servidor solo ejecuta Python 2.5 o Python 2.7, ya que mezclarlos sería una pérdida de recursos. Si los servidores 2.7 se usan mucho más que los servidores 2.5 y App Engine no ha compensado esto, notará que el rendimiento también baja.

Estas son las 3 primeras cosas que se me ocurrieron, pero hay muchos factores. Incluso el clima podría en teoría afectar el rendimiento.

+0

Los módulos C no están permitidos en Google Appengine, así que eso está descartado. Creo que el Memcache de google appengine incorporado está siendo utilizado – Gautam

+0

Y si ese es compilado C o simplemente Python es lo que quise decir :-) –

+0

Lo siento, ninguno de esos son parámetros de ajuste relavent en el motor de la aplicación google. los binarios de Python y servidor no son configurables en el motor de la aplicación, solo el código fuente de Python. – SingleNegationElimination

5

El soporte de Python 2.7 es aún experimental. Un aspecto de ser nuevo y experimental es que no ha tenido el tipo de rendimiento de cocción y ajuste que posee Python 2.5.

+0

Gracias por Su respuesta. Probablemente fue ingenuo de mi parte esperar algo mejor de la característica experimental. ¡Espero ver python2.7 acercándose a 2.5 en un futuro cercano! – Ski

+2

Pero, por otro lado, Google sugiere utilizar python27 para moverse por allí el último aumento masivo de precios en 2011-12-01 ... – max

+1

Python27 admite múltiples solicitudes concurrentes, lo que le permite manejar la misma carga con menos instancias, y por lo tanto una menor factura por ejemplo horas. –

0

Una cita de la propia Google

Experimental!

El tiempo de ejecución de Python 2.7 es una novedad experimental, innovadora, y nueva característica que cambia rápidamente para App Engine.Desafortunadamente, al estar en el borde sangrante, podemos hacer cambios incompatibles hacia atrás. Informaremos a la comunidad una vez que el tiempo de ejecución de Python 2.7 sea ya no sea experimental.

Todavía no lo han hecho para uso en producción, es como una prueba beta.

Mantenga su aplicación en python2.7 hasta que la fase experimental haya finalizado.

También puede tratar de subir sólo los archivos compilados .pyc debido tiempo de ejecución python27 apoya bytecode upload

3

Did ha migrado la aplicación para utilizar WSGI en lugar de CGI cuando se ejecuta en Python 2.7?

Es posible que la interfaz CGI sea solo una envoltura alrededor de WSGI que ahora está habilitada para 2.7.

+1

No, no migré a wsgi. Pero tu publicación me motivó a probar python27 con wsgi y 'threadsafe: yes', así que voy a probar eso ahora y espero tener diferencias de rendimiento mañana. – Ski

+0

Hubo mañana ayer. ¿Qué hay de las pruebas de rendimiento? – lig

+0

Bueno, no hay mucho que decir, porque no podía ver la diferencia. Si hubiera una mejora, no podría ser superior a ~ 15% (python27 wsgi con 'freadsafe: yes' en comparación con cgi). Estaba escribiendo mi aplicación para cgi, y mantuve el bootstrapping tan ligero como pude, tal vez por eso no veo ninguna mejora con el multihilo. Resu mi es: Python27 es terriblemente lento en este momento, pero espero que sea más rápido cuando esté fuera de la etapa experimental. – Ski

1

Al cambiar a python2.7 el rendimiento de mi aplicación bajo carga es 3 veces peor.

Con 2,5:

Conexión Times (ms) min significa [+/- SD] mediana max conexion: 36 48 15,4 41 109 de procesamiento: 685 3010 1893,3 2657 9255 de espera: 685 3009 1893.3 2656 9255 Total: 725 3058 1900,5 2711 9333

Porcentaje de las solicitudes servido dentro de un cierto tiempo (ms) 50% 2711 66% 3287 75% 3896 80% 4521 90% 6146 95% 7078 98% 7934 99% 8413 100% 9333 (solicitud más largo)

Con 2,7:

Conexión Times (ms) min significa [+/- SD] mediana max conexion: 35 46 11,4 41 96 de procesamiento: 1076 7614 4190,5 6711 32284 de espera: 1075 7614 4190,5 6711 32283 Total: 1124 7660 4195,5 6764 32353

Porcentaje de las solicitudes servida dentro de un cierto tiempo (ms) 50 % 6764 66% 7790 75% 8751 80% 9392 90% 10844 95% 13139 98% 25219 99% 27259 100% 32 353 (solicitud más largo)

Cuestiones relacionadas