Python 2 SDK 包含 Appstats 程式庫,這個程式庫可用於剖析應用程式遠端程序呼叫 (RPC) 的效能。App Engine RPC 是應用程式與 App Engine Service API 之間的來回網路呼叫。例如以下 API 呼叫都是 RPC 呼叫:
- Datastore 呼叫,例如
ndb.get_multi()
、ndb.put_multi()
或ndb.gql()
。 - Memcache 呼叫,例如
memcache.get()
或memcache.get_multi()
。 - 網址擷取呼叫,例如
urlfetch.fetch()
。 - 郵件呼叫,例如
mail.send()
。
可擴充應用程式的最佳化或除錯工作可能相當困難,因為有許多問題可能會導致效能不彰或產生預期外的費用。這些問題非常難以透過常見的資訊來源 (如記錄檔或要求的時間統計資料) 進行偵錯。大多數的應用程式要求會將大部分時間花在等待網路呼叫完成,屬於滿足要求的過程之一。
為了讓應用程式保持快速運作,您必須知道以下事項:
- 您的應用程式是否發出不必要的 RPC 呼叫?
- 如要取得相同的資料,是否應對資料進行快取處理,而非重複發出 RPC 呼叫?
- 如果平行執行多個要求,而非序列執行,應用程式的執行效果是否會更好?
Appstats 資料庫可協助您回答這些問題,並且讓您能夠剖析 RPC 呼叫,以驗證應用程式是否正以最有效的方式使用 RPC 呼叫。Appstats 可追蹤特定要求的所有 RPC 呼叫,並回報每次呼叫的時間與成本。
將應用程式的 RPC 使用量最佳化,或許也可以減少您的支出。請參閱「管理應用程式資源」。
設定
Appstats 無須下載或安裝,即可開始使用。您只需如下步驟所述,設定您的應用程式、重新部署並存取 Appstats 指控台即可,其餘部分由 Appstats 資料庫負責。
1.安裝事件記錄器
如果要記錄網路要求的統計資料,您應用程式的每個要求處理常式皆須叫用 Appstats。請依據您應用程式使用的架構,選擇以下其中一項:
WSGI 要求處理常式
如果要以 WSGI 要求處理常式使用 Appstats,包括 webapp2 這類 WSGI 架構,請務必將 appstats 中介軟體納入 WSGI 應用程式。達成此目的最簡單的方法,就是使用
appengine_config.py
定義 WSGI 中介軟體,以納入每個 WSGI 應用程式。如果該檔案尚不存在,請在應用程式的根目錄中建立名為
appengine_config.py
的檔案,並在檔案中加入以下函式:叫用 WSGI 應用程式之前,如果有找到此檔案,執行階段會匯入檔案並叫用
webapp_add_wsgi_middleware
函式。如要進一步瞭解
appengine_config.py
,請參閱下方的選用設定。Django 架構
如要在 Django 應用程式中安裝 Appstats 中介軟體,請編輯
settings.py
檔案,並新增下列程式碼,將該行做為MIDDLEWARE_CLASSES
中的第一個項目:MIDDLEWARE_CLASSES = ( 'google.appengine.ext.appstats.recording.AppStatsDjangoMiddleware', # ... )
Appstats 中介軟體必須為第一個項目,分析器才能將其他中介軟體納入統計資料中。
在適當情況下,Django 中介軟體會呼叫 Appstats 來記錄事件。您無需變更任何其他的應用程式程式碼。
2. 設定主控台路徑
您可以使用網頁瀏覽器前往您應用程式的網址,進入 Appstats 主控台。可使用以下其中一種方法設定網址路徑:
預設網址
如果要將 Appstats 對應至預設目錄 (
/_ah/stats/
),請將appstats
內建項目新增至app.yaml
檔案:自訂網址
如果需要將 Appstats 對應至預設目錄以外的目錄,請在
app.yaml
中使用url
指令:- url: /stats.* script: google.appengine.ext.appstats.ui.app
3. 選用設定
您可以在應用程式根目錄的 appengine_config.py 檔案中新增內容,以設定 Appstats 的行為。如需完整的設定選項範例,請查看 SDK 中的 google/appengine/ext/appstats/sample_appengine_config.py
檔案。
有關 appengine_config.py
的注意事項:
- 如果您的要求處理常式會修改
sys.path
,請務必在appengine_config.py
的sys.path
中進行相同的修改,如此 Appstats 網路介面才能看見所有檔案。
顯示成本
AppStats 可以追蹤 RPC 的「成本」和時間。如果應用程式速度夠快,但費用比您預期來得高,請找出成本超出預期的作業。如要開啟費用追蹤功能,請在 appengine_config.py
檔案中設定 appstats_CALC_RPC_COSTS = True
。
4. 從開發伺服器測試 Appstats
您可以使用開發伺服器測試 Appstats 設定。如果將主控台路徑設為預設網址,就可以在 http://localhost:8080/_ah/stats/ 使用主控台。
5. 部署
如果您對 Appstats 設定感到滿意,請部署應用程式。如果您設定控制台路徑以使用上述預設網址,可以前往 http://your_app_id.appspot.com/_ah/stats
存取控制台。
Appstats 主控台導覽
Appstats 主控台會提供各種高階資訊,包括已發出的 RPC 呼叫、要求的網址路徑、近期要求記錄以及個別要求的詳細資料:
「RPC Stats」表格會顯示應用程式發出的各個 RPC 類型統計資料。按一下加號按鈕,便會展開項目,依照 RPC 的路徑要求顯示細項資料:
「Path Stats」表格會顯示傳送到應用程式的每個路徑要求的統計資料。按一下加號按鈕,便會展開項目,依照路徑要求的 RPC 來顯示細項資料:
如果啟用 API 成本追蹤功能,該表格也會顯示成本。
「Requests History」表格會顯示個別要求的相關資料。按一下加號按鈕,便會展開項目,依照 RPC 顯示細項資料。按一下要求連結,則會顯示要求的時間軸,包括個別 RPC 的時間:
RPC 的「Timeline」圖表會顯示發起特定 RPC 呼叫的時間,以及處理要求所花的時間。「RPC Total」長條代表等待 RPC 呼叫所花的總時間,而「Grand Total」長條則是處理要求所花的總時間。如下列時間軸所示,大多數時間都花在 RPC 呼叫。通常都是如此情況。其他分頁則會顯示要求的其他相關資訊。在分析效能時,瞭解 RPC 呼叫對應用程式回應時間的影響,是相當重要的一點。
開發人員可透過「Interactive Playground」將任意 Python 程式碼輸入至網路表單,並在應用程式環境的內部執行。
前往 Appstats 後,請按一下 Interactive Playground 的連結。會出現只有一個文字區域的表單。請在文字區域中輸入任何 Python 程式碼,然後提交表單,即可執行該程式碼。文字區域會顯示標準輸出下會顯示的任何結果,同時顯示程式碼產生的 RPC 呼叫的時間軸分析。
可啟用或停用 Interactive Playground。在 SDK 中,該功能預設為啟用,在實際工作環境中則時預設停用。如要啟用這項功能,請在
appengine_config.py
檔案中加入以下這行程式碼:<pre suppresswarning="yes" class="prettyprint"> appstats_SHELL_OK = True </pre>
運作方式
Appstats 會使用 API 掛鉤將自己新增至 App Engine 服務 API 底層的遠端程序呼叫架構內,並記錄要求處理常式期間所有進行的 API 呼叫的統計資料,然後再使用 __appstats__
的命名空間將資料儲存到 Memcache 中。Appstats 最多可保留最近 1,000 筆要求的統計資料。資料包含摘要記錄,每筆記錄約 200 位元組,並包含詳細的記錄,每筆最多 100 KB。您可以控制詳細資訊記錄中儲存的資訊量。(請參閱「選用設定」和設定檔範例)。
API 掛鉤會對要求處理常式增加一點負擔。Appstats 會在 info 等級的記錄中新增訊息,以回報 appstats 資料庫自身所消耗的資源數量。記錄行外觀如下:
<pre suppresswarning="yes" class="prettyprint">
INFO 2009-08-25 12:04:07,277 recording.py:290] Saved; key: __appstats__:046800, part: 160 bytes, full: 25278 bytes, overhead: 0.019 + 0.018; link: http://your_app_id.[REGION_ID].r.appspot.com/stats/detail?time=1234567890123
</pre>
這行會回報已更新的 Memcache 索引鍵、摘要 (part
) 和詳細資料 (full
) 記錄的大小,以及記錄這項資訊所花費的時間 (以秒為單位)。行中將包含 Appstats 管理介面的連結,而此事件的資料即顯示在該介面中。