剖析 Go 程式碼

本頁面說明如何設定 Stackdriver Profiler 來剖析 Go 程式碼。針對 Go,Profiler 提供 CPU、堆積、爭用情況和執行緒剖析功能。爭用情況剖析會擷取有關 Go 互斥情形的資訊;執行緒剖析則會擷取有關 Goroutine 的資訊,而不擷取作業系統執行緒資訊。如需有關剖析和可用剖析類型的詳細資訊,請參閱剖析概念

您可在下列環境中的 Linux 上使用剖析代理程式:

除非另有說明,否則每個環境的分析器代理程式都支援所有官方維護的 Go 版本。詳情請參閱「Go 語言版本政策」。

啟用 Profiler API

使用剖析代理程式之前,請確保基礎 Profiler API 已啟用。您可以查看 API 狀態,或視需要使用 Cloud SDK gcloud 指令列工具或 Cloud Console 來啟用 API。

Cloud SDK

  1. 如果您尚未在工作站上安裝 Cloud SDK,請參閱 Google Cloud SDK

  2. 執行下列指令:

    gcloud services enable cloudprofiler.googleapis.com
    

詳情請參閱 gcloud services

Cloud Console

  1. 前往「APIs & Services」(API 和服務) 資訊主頁。

    前往 API 和服務頁面

  2. 選取您要用來存取 API 的專案。

  3. 按一下 [Add APIs and Services] (新增 API 和服務) 按鈕。

    新增 API 和服務

  4. 搜尋「Profiler API」

  5. 選取搜尋結果中的 [Stackdriver Profiler API]

  6. 如果畫面顯示 [API enabled] (API 已啟用),代表 API 已啟用。如果未顯示,請按一下 [Enable] (啟用) 按鈕。

使用 Stackdriver Profiler

如要透過所有支援的環境使用 Profiler,您可以先在應用程式內匯入套件,然後儘早在程式碼中初始化 Profiler。

Go 的剖析代理程式預設已啟用下列剖析資料類型:

  • CPU
  • 堆積
  • 堆積分配
  • 執行緒

MutexProfiling 設定選項設為 true,即可啟用互斥爭用情況 (在介面中的「Contention」(爭用情況) 部分)。

如需有關 Profiler API (包含所有設定選項) 的詳細資訊,請參閱公用 API 說明文件

Compute Engine 和 Google Kubernetes Engine

在 Compute Engine 和 GKE 中,程式碼新增項目如下所示:

// snippets is an example of starting cloud.google.com/go/profiler.
package main

import (
	"cloud.google.com/go/profiler"
)

func main() {
	// Profiler initialization, best done as early as possible.
	if err := profiler.Start(profiler.Config{
		Service:        "myservice",
		ServiceVersion: "1.0.0",
		// ProjectID must be set if not running on GCP.
		// ProjectID: "my-project",
	}); err != nil {
		// TODO: Handle error.
	}
}

在 Compute Engine 和 GKE 環境中,profiler.Config 包含兩個參數:

  • Service:要剖析的服務的名稱
  • ServiceVersion:要剖析的服務的版本 (選填)

如需有關這些設定選項的詳細資訊,請參閱服務名稱和版本引數

App Engine 環境

在 App Engine 彈性環境和 App Engine 標準環境中,程式碼新增項目和 Compute Engine 及 GKE 的程式碼新增項目幾乎相同,只有一個例外狀況。在上述兩個 App Engine 環境中,ServiceServiceVersion 參數都是直接衍生自環境,因此您不用另外指定。

// appengine is an example of starting cloud.google.com/go/profiler on
// App Engine.
package main

import (
	"cloud.google.com/go/profiler"
)

func main() {
	// Profiler initialization, best done as early as possible.
	if err := profiler.Start(profiler.Config{
		// Service and ServiceVersion can be automatically inferred when running
		// on App Engine.
		// ProjectID must be set if not running on GCP.
		// ProjectID: "my-project",
	}); err != nil {
		// TODO: Handle error.
	}
}

不過,如果您是在本機執行應用程式,請設定 GCP 專案的 ID「ProjectID」及 Service 參數 (在 profiler.Config 中),因為這些值無法從本機環境衍生。您不需要設定 ServiceVersion

如果您使用 App Engine 標準環境,請參閱「將您的應用程式遷移至 Go 1.11」一文,進一步瞭解需要對應用程式進行哪些變更。此外,您必須使用 Cloud SDK 226.0.0 以上版本。如要更新 Cloud SDK,請執行下列指令:

    gcloud components update

執行應用程式的步驟如下:

  1. 更新依附元件。

    go get -u cloud.google.com/go/profiler
    
  2. 將應用程式部署到您的 App Engine 彈性環境或 App Engine 標準環境。

    go app deploy [DEPLOYMENT]
    

    其中 DEPLOYMENT 是指設定檔的路徑,舉例來說,DEPLOYMENT 可能是 main/app.yaml

分析資料

Profiler 收集資料之後,您就可以使用 Profiler 介面來查看和分析資料。如要開始使用介面,請參閱「開啟 Profiler 介面」。

服務名稱和版本引數

載入 Profiler 代理程式時,您可指定 service-name 引數及 service-version 引數 (選用) 來加以設定。

「service name」(服務名稱) 可讓 Profiler 收集有關這項服務的所有備用資源剖析資料。分析器服務會針對每個服務名稱的各個版本及區域組合,確保平均每分鐘一個剖析作業的收集頻率。

舉例來說,如果您有一個服務,共有兩個版本在三個區域的備用資源執行,則分析器會為這個服務建立平均每分鐘 6 個剖析作業。

如果您為備用資源使用不同的服務名稱,系統剖析服務的頻率就會比平常更高,相對地負擔也會更大。

選取服務名稱時:

  • 選擇的名稱要能清楚代表應用程式架構中的服務。如果您只執行單一服務或應用程式,服務名稱的選擇就不那麼重要;但如果應用程式是以一組微服務的形式執行,建議就應選擇適當的服務名稱。

  • 請勿在 service-name 字串中使用任何 process-specific 值 (例如 ID)。

  • service-name 字串必須符合這個規則運算式:

    ^[a-z]([-a-z0-9_.]{0,253}[a-z0-9])?$

使用靜態字串 (如 imageproc-service) 做為服務名稱就是不錯的做法。

「service version」(服務版本) 則為選填項目。如果您指定服務版本,Profiler 可從多個執行個體匯總剖析資訊並正確顯示;這項引數可用來標記服務部署時的不同版本。Profiler UI 可讓您按照服務版本篩選資料,這樣一來,您就能比較新舊版程式碼的運作效能。

service-version 引數的值是任意形式的字串,不過這個引數的值看起來通常和版本號碼類似,例如 1.0.02.1.2

代理程式記錄

剖析代理程式可藉由記錄檔來報告偵錯資訊。如要啟用這項功能,請在啟動代理程式時將 DebugLogging 選項設為 true

profiler.Start(profiler.Config{..., DebugLogging: true});

使用 Linux Alpine 執行

如果您使用的 Docker 映像檔是透過 Linux Alpine (例如 golang:alpine 或只有 alpine) 來執行,可能會看到下列驗證錯誤:

connection error: desc = "transport: authentication handshake failed: x509: failed to load system roots and no roots provided"

請注意,要啟用代理程式記錄功能才能看到錯誤相關資訊。根據預設,代理程式不會輸出任何記錄檔訊息。

以上錯誤指出,透過 Linux Alpine 執行的 Docker 映像檔並未預設安裝 SSL 根憑證;如果要讓剖析代理程式與 Profiler API 相互通訊,就必須具有這些憑證。請將 apk 指令加到您的 Dockerfile 來解決這項錯誤:

FROM alpine
...
RUN apk update \
 && apk add --no-cache ca-certificates

接著您必須重新建構和重新部署應用程式。

後續步驟

如要進一步瞭解 Profiler 的其他功能,請參閱「使用 Stackdriver Profiler 介面」:

  • 瞭解 Profiler 控制項目。
  • 瞭解如何放大特定框架。
  • 瞭解如何篩選和聚焦圖表。
  • 瞭解如何比較剖析資料。
本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Stackdriver Profiler
需要協助嗎?請前往我們的支援網頁