2010-11-25 185 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