2010-11-25 16 views
8

Estoy considerando utilizar AppEngine para implementar una aplicación web que estoy desarrollando. Como parte de mi investigación en la plataforma App Engine, he estado comprobando el tiempo de respuesta para solicitudes simples. Con este fin, he escrito un simple servlet de ping:Varianza del tiempo de respuesta de AppEngine

@SuppressWarnings("serial") 
public class Ping extends HttpServlet 
{ 
    @Override 
    public void doGet(@SuppressWarnings("unused") HttpServletRequest xiReq, 
        HttpServletResponse xiResp) 
        throws IOException 
    { 
    xiResp.setContentType("text/plain"); 
    xiResp.getWriter().println("PONG"); 
    } 
} 

entonces he escrito un programa Java para hacer una solicitud cada segundo a este servlet y medir el tiempo que tarda en completar la solicitud. La obtención del contenido de la página utiliza el siguiente código.

private static String getPageContent(String url) throws IOException { 
    String result = null; 
    URL reqURL = new URL(url); 
    URLConnection connection = reqURL.openConnection(); 
    connection.setConnectTimeout(30 * 1000); 
    connection.setReadTimeout(30 * 3000); 
    InputStream webStream = connection.getInputStream(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(webStream)); 
    result = reader.readLine(); 
    reader.close(); 
    return result; 
} 

Cada 3 minutos mis salidas de guión monitor de datos en el siguiente formato:

date,num_reqs,num_failedreqs,avg_reqtime,num_normreqs,avg_normreqtime,num_latereqs,avg_latereqtime 

normrequests son todas las peticiones que tengan menos de 500 ms para completar latereqs son todas las solicitudes que tardan más de 500 ms para completar failreqs son cualquiera que arroje una excepción IO durante la descarga o si el contenido recibido no es igual a "PONG"

Mi salida de los últimos ~ 20 minutos es la siguiente:

Thu Nov 25 10:04:01 GMT 2010,300,0,186,295,171,5,1093 
Thu Nov 25 10:09:28 GMT 2010,300,0,191,292,173,8,842 
Thu Nov 25 10:14:52 GMT 2010,300,0,184,295,167,5,1177 
Thu Nov 25 10:20:15 GMT 2010,300,0,182,294,168,6,876 
Thu Nov 25 10:25:46 GMT 2010,300,0,172,298,167,2,827 

Esto demuestra que en cada período de 5 minutos hay entre 2 y 8 "tarde" solicitudes teniendo un promedio de entre 827 y 1177ms para completar.

Esto se compara con la siguiente salida del mismo período que se ejecuta en el mismo servlet en una instancia micro que se ejecuta en Amazon EC2.

Thu Nov 25 10:03:53 GMT 2010,300,0,177,300,177,0,0 
Thu Nov 25 10:09:20 GMT 2010,300,0,179,299,178,1,583 
Thu Nov 25 10:14:43 GMT 2010,300,0,176,299,175,1,545 
Thu Nov 25 10:20:07 GMT 2010,300,0,176,299,175,1,531 
Thu Nov 25 10:25:37 GMT 2010,300,0,181,298,178,2,669 

Esto muestra muchas menos solicitudes "tardías" y el tiempo de respuesta para estas solicitudes lentas es mucho menor.

Estoy haciendo mis solicitudes desde un servidor con sede en el Reino Unido. Mi instancia de Amazon EC2 se ejecuta en "US East". No sé dónde está Google ejecutando mi instancia de AppEngine.

¿Puedo hacer algo para mejorar la coherencia de los tiempos de respuesta de AppEngine o la varianza que veo normal para AppEngine?

Respuesta

0

Por lo que puedo decir, la variación es simplemente una propiedad de la red que Google está utilizando.

3

Las solicitudes "tardías" que está viendo se deben a que App Engine está girando un nuevo tiempo de ejecución de Java para gestionar su solicitud. App Engine aumenta el número de instancias de su aplicación que se ejecuta bajo demanda y genera instancias inactivas después de un período de inactividad.

Este comportamiento es mucho más visible para aplicaciones de poco tráfico, porque incluso un usuario individual puede causar un pico que requiere que se generen nuevos tiempos de ejecución, y es más probable que las instancias se apaguen por inactividad. A medida que aumenta el tráfico de su aplicación, la cantidad de solicitudes de precalentamiento que ve disminuirá en proporción al tráfico.

+0

Esto no es lo que estoy viendo ya que los registros de mi aplicación no muestran nuevas instancias que se inician. Estoy enviando 1 solicitud por segundo en mi aplicación y esto es suficiente para mantener una sola instancia siempre en ejecución. – mchr

+1

¿Sus registros no muestran _any_instancias iniciadas? App Engine ejecutará más de una instancia, incluso para tráfico bastante bajo, para manejar picos de tráfico a corto plazo. –

+0

Estaba ejecutando un script haciendo una solicitud constante/carga de segundo. App Engine muestra un registro cuando inicio el script y se inicia una instancia para manejar la carga. Esta única instancia maneja fácilmente mi solicitud/segundo.No se inician más instancias mientras se ejecuta el script. – mchr

Cuestiones relacionadas