我正在考虑使用AppEngine部署我正在开发的webapp。在对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
normrequest是指所有花费少于500ms来完成Latereqs的请求,都是花费超过500ms来完成failreqs的请求,是那些在下载期间或接收到的内容不等于“ 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毫秒之间才能完成。
该结果与在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差异正常?
据我所知,差异只是Google使用的网络属性。