2010-11-25 89 views
8

我正在考虑使用AppEngine来部署我正在开发的webapp。作为我对AppEngine平台调查的一部分,我一直在检查简单请求的响应时间。为此,我写了一个简单的PING的servlet: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"); 
    } 
} 

然后我写了一个Java程序,使每一秒这个servlet和时间需要多长时间才能完成的请求的请求。获取页面内容使用以下代码。

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; 
} 

每3分钟我的监控脚本输出的格式如下数据:

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

normrequests是其需要不到500ms的所有请求完成 latereqs是其需要更长的时间超过500毫秒即可完成所有的请求 failreqs是任何在下载过程中抛出IO异常,或者收到的内容不等于“PONG”

我输出的最后~20分钟如下:

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 

这表明,在每5分钟的时间内,有2到8个“迟到”请求需要平均在827到1177ms之间才能完成。

与在Amazon EC2上运行的微型实例上针对同一个servlet运行的同一时间段的以下输出进行比较。

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 

这显示的“迟到”请求少得多,这些慢请求的响应时间要低得多。

我正在从位于英国的服务器提出请求。我的亚马逊EC2实例正在“美国东部”运行。我不知道Google运行我的AppEngine实例的位置。

我可以做任何事情来改善AppEngine响应时间的一致性,还是我看到AppEngine的正常变化?

回答

0

据我所知,差异只是Google正在使用的网络的一个属性。

3

您看到的“迟到”请求是由于App Engine旋转了一个新的Java运行时来处理您的请求。 App Engine会增加应用程序按需运行的实例数量,并在闲置一段时间后关闭空闲实例。

对于低流量应用程序,此行为更加明显,因为即使是单个用户也可能导致需要重新启动新运行时的高峰,并且实例更有可能因为处于非活动状态而关闭。随着应用流量的增加,您看到的预热请求数量将与流量成比例地下降。

+0

这不是我所看到的,因为我的应用程序日志没有显示正在启动的新实例。我每秒向我的应用程序发送一个请求,这足以让单个实例始终运行。 – mchr 2010-11-26 10:28:40