【问题标题】:AppEngine Response Time VarianceAppEngine 响应时间差异
【发布时间】:2011-05-15 15:17:36
【问题描述】:

我正在考虑使用 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 毫秒的所有请求 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 到 1177 毫秒才能完成。

这与在 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

这表明“迟到”的请求要少得多,而且这些慢速请求的响应时间要短得多。

我从位于英国的服务器发出请求。我的 Amazon EC2 实例在“美国东部”运行。我不知道 Google 在哪里运行我的 AppEngine 实例。

我可以做些什么来提高 AppEngine 响应时间的一致性,或者我看到的 AppEngine 差异是否正常?

【问题讨论】:

    标签: java google-app-engine tomcat


    【解决方案1】:

    您看到的“延迟”请求是由于 App Engine 启动了一个新的 Java 运行时来处理您的请求。 App Engine 会根据需要增加您应用的运行实例数量,并在一段时间不活动后停止空闲实例。

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

    【讨论】:

    • 这不是我看到的,因为我的应用程序日志没有显示正在启动的新实例。我每秒向我的应用程序发送 1 个请求,这足以让单个实例始终运行。
    • 您的日志没有显示 任何 个实例正在启动?即使流量相当低,App Engine 也会运行多个实例,以处理短期流量高峰。
    • 我正在运行一个脚本,该脚本产生恒定的 1 个请求/秒负载。当我启动脚本并启动一个实例来处理负载时,AppEngine 会显示一个日志。这个单一实例可以轻松处理我的 1 个请求/秒。脚本运行时不会启动更多实例。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多