2012-04-29 37 views
6

He mejorado mucho mi código y ahora toda la API funciona muy rápido, también agregué Memcache y tengo una gran proporción de aciertos ... Pero a veces tengo retrasos sin sentido.Google App Engine retraso extraño

He adjuntado aquí la captura de pantalla appstats más significativa: más de 20 segundos en total para ejecutar 90ms de RPC; ¿como es posible? ¿Dónde debería buscar el origen de esos retrasos?

estoy realmente atascado porque no entiendo lo que está pasando entre los RPC y no sé qué más puedo hacer con el fin de obtener más información.

Solo una idea: cada llamada HTTP es manejada por la misma instancia de GAE, ¿verdad? Debido a que mis instancias tomaron mucho tiempo para el calentamiento ... Pero no creo que esté relacionado

BTW: Estoy codificando en Java.

appstats statistics

Respuesta

2

Por lo general, el "agujero" no contabilizado en el medio de appstats es la ejecución del código.
Appstats registra todas las entradas y salidas de rpc y las áreas que no puede registrar son su código real en ejecución.

¿Tiene registros de la hora en que se encontraba la aplicación entre esas dos llamadas?

+0

gracias shay ... sí, registro un montón de cosas con log.fine (..), así que simplemente debería habilitar el nivel y luego echar un vistazo de nuevo. –

+0

Lo que no estoy seguro es que 100% es que una llamada HTTP es manejada por instancias diferentes. ¿Es posible? ¡Porque esto podría ser otro problema, debido al largo tiempo dedicado al calentamiento de una nueva instancia! –

+0

@MicheleOrsi no se puede saltar la instancia durante la ejecución del controlador –

2

enorme, la latencia 'inexplicable' es casi siempre de calentamiento solicitudes engullendo recursos. Inspeccione los registros de appengine para ver cuánto api_ms y cpu_ms se usan en los calentamientos.

Puede evitar los calentamientos aumentando la latencia máxima pendiente en el panel de control de appengine. Permitir una mayor latencia significa que las solicitudes esperarán más antes de disparar una nueva instancia. Esto podría hacer que cada solicitud sea un poco más lenta, pero evitará solicitudes de carga pesadas.

para ayudar con las solicitudes de preparación, asegúrese de que su appengine-web.xml tiene:

<warmup-requests-enabled>true</warmup-requests-enabled> 

Esto hará que el despachador appengine para disparar de forma preventiva nuevos casos en los que se están sobrecargados los actuales {es decir, comienza a cargarse antes de que una solicitud vaya a la nueva instancia}.

entonces, en los servlets lentos afectadas, asegúrese de poner load-on-startup en su web.xml:

<servlet> 
    <servlet-name>my-servlet</servlet-name> 
    <servlet-class>com.company.MyServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

load-on-startup simplemente asegura que sus servlets de alta prioridad siempre están dispuestos ir tan pronto como termine la solicitud de calentamiento.

+0

Gracias, pero ya estoy haciendo todas sus sugerencias: warm-up-requests-enabled, load-on-startup y mi Latencia pendiente está configurada en 11.5 seg. - Automático .. –

+0

¿Puede volver a ejecutar su prueba y observar cómo muchas instancias se disparan? Compruebe si está recibiendo solicitudes de carga en los registros, y cuántos de ellos. Además, ¿está disparando todos sus rpcs al mismo tiempo? Si su navegador tiene abiertas más de dos conexiones, se bloqueará en las pendientes, lo que puede hacer que sus servlets se bloqueen. Mire las solicitudes en firebug para ver si puede elegir qué solicitudes lo llevan a 20 en 90ms de solicitudes. – Ajax

+0

Además, una latencia pendiente de 11.5s significa que cada conexión puede tener una latencia de más de 10s. Mida sus solicitudes de carga. Si una solicitud de carga es de 15 segundos y la latencia máxima pendiente es de 11 segundos, la primera solicitud de carga esperará 10 segundos y luego tomará otros 15 segundos para iniciar una nueva instancia.Es posible que desee desactivar la latencia pendiente y simplemente muerda la viñeta en las solicitudes de carga. – Ajax