Java AppEngine响应时间方差

Java AppEngine响应时间方差,java,google-app-engine,tomcat,Java,Google App Engine,Tomcat,我正在考虑使用AppEngine部署我正在开发的Web应用程序。作为我对AppEngine平台调查的一部分,我一直在检查简单请求的响应时间。为此,我编写了一个简单的PING servlet: @SuppressWarnings("serial") public class Ping extends HttpServlet { @Override public void doGet(@SuppressWarnings("unused") HttpServletRequest xiReq,

我正在考虑使用AppEngine部署我正在开发的Web应用程序。作为我对AppEngine平台调查的一部分,我一直在检查简单请求的响应时间。为此,我编写了一个简单的PING servlet:

@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是指完成时间少于500毫秒的所有请求 LATEREQ是所有需要超过500毫秒才能完成的请求 FailReq是在下载过程中或接收到的内容不等于“PONG”时引发IO异常的任何类型

我最后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到1177毫秒才能完成

这与在AmazonEC2上运行的微实例上针对同一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实例正在“美国东部”运行。我不知道谷歌在哪里运行我的AppEngine实例


我能做些什么来提高AppEngine响应时间的一致性吗?或者我看到的差异对AppEngine来说是正常的吗?

您看到的“延迟”请求是由于App Engine启动了一个新的Java运行时来处理您的请求。appengine增加了它按需运行的应用程序的实例数,并在一段时间不活动后降低空闲实例数


这种行为在低流量应用程序中更为明显,因为即使是单个用户也可能导致需要启动新运行时的峰值,并且实例更有可能因不活动而关闭。随着应用程序流量的增加,您看到的预热请求数量将随着流量的增加而减少。

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

这不是我看到的,因为我的应用程序日志没有显示正在启动的新实例。我每秒向我的应用发送1个请求,这足以使单个实例始终运行。您的日志中没有显示任何正在启动的实例吗?应用程序引擎将运行多个实例,即使流量相当低,以处理短期流量峰值。我运行的脚本使恒定的1个请求/秒负载。当我启动脚本并启动一个实例来处理负载时,AppEngine会显示一个日志。这个实例可以轻松处理我每秒1次的请求。脚本运行时,不再启动其他实例。