2012-02-05 72 views
0

最近,我看到GAE處理請求的時間比一週前長很多。我的代碼沒有任何變化,但GAE現在需要4000-12000ms來響應請求。更糟糕的是,我有大量的實例可用,其中有0個請求。
有沒有其他人看到過這種情況? 我可以做些什麼來解決它?我已經做了15個額外的實例(並通過鼻子支付給他們),但似乎沒有任何事情可靠地向其他空閒實例發送請求。 我的賬單已經從70-90c /天變爲5-8美元/天,無需更改任何代碼或增加流量。事實上,由於巨大的延遲,我正在流失。Google AppEngine將所有請求發送給同一個實例

QPS* Latency* Requests Errors Age Memory Availability 
    0.000 0.0 ms 1378 0 10:10:09 57.9 MBytes Dynamic 
    0.000 0.0 ms 1681 0 15:39:57 57.2 MBytes Dynamic 
    0.017 9687.0 ms 886 0 10:19:10 56.7 MBytes Dynamic 

回答

1

我推薦安裝AppStats來獲取每個請求中花費很長時間的圖片。我猜你會遇到一些爭用問題或由於一些新的數據配置導致的大量讀/寫操作。

空閒實例無助於減少延遲 - 它看起來像每個請求需要很長時間,並且每分鐘少於一個請求(無論如何,在本示例中),10秒的請求可以在同一個實例上連續運行。

0

我們在我們的應用程序中有類似的問題。就我們而言,我們認爲GAE的調度程序在平衡對現有實例的請求方面做得不好。

在某些情況下,調度程序決定啓動新的實例,而不是重新使用已有的實例。由於旋轉新實例耗時5至45秒,我懷疑這可能是發生在你身上的事情。

嘗試探討以下,看看它是否可以幫助你:

  1. 確保您的應用具有線程安全啓用,這樣你可以處理的併發請求。如果您使用的是Python,則可以在您的app.yaml中進行配置,如果使用的是Java,則可以在appengine-web.xml中進行配置。當然,您還需要確保應用程序中的代碼是線程安全的。
  2. 在您的應用程序設置中,如果它仍然處於自動設置狀態,則將最小待處理延遲更改爲非自動設置。現在我建議大約10秒鐘,但您可以稍後嘗試哪種設置最適合您。這迫使調度程序等待一定的時間,以查看在啓動新實例之前是否有任何實例可用。

現在,要回答您有關sending all requests to same instance的原始問題,據我所知,無法解決特定前端實例以便將請求引導至該特定實例。

您可以做的是將您的應用遷移到使用後端實例而不是常規前端實例。後端提供了一種方式directly target any particular instance within it。您可以將您的應用程序部署在單個後端,以更好地控制您生成的實例數量。並且由於使用後端繞過調度程序,您不會遇到由新實例旋轉引起的延遲。

使用此方法的主要缺點是您失去了使用前端實例的自動擴展性優勢。但從日常的低收費情況看,我認爲可擴展性還不是您應用規模的主要關注點。