剖析 Java 程式碼

本頁面說明如何設定 Stackdriver Profiler 來剖析 Java 程式碼。針對 Java,Profiler 提供 CPU、堆積和實際時間剖析;詳情請參閱剖析概念一文。

您必須使用 OpenJDK 或 Oracle JDK 的版本 7、8、9 或 11。

假如您要設定 Profiler,通常需要在啟動 Java 時安裝及載入剖析代理程式,並以引數形式為代理程式提供設定值。如果您使用 Java,則可在下列環境中的 Linux 上使用剖析代理程式:

  • Compute Engine
  • Google Kubernetes Engine
  • App Engine 彈性環境
  • App Engine 標準環境 (需要 App Engine SDK 1.9.64 以上版本)

您還可以在非 Google Cloud Platform 系統中剖析 Java 程式碼;詳情請參閱「在 Google Cloud Platform 以外的環境剖析」。

啟用 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] (啟用) 按鈕。

安裝 Profiler 代理程式

Compute Engine

建立目錄 (例如 /opt/cprof) 來安裝 Profiler:

sudo mkdir -p /opt/cprof

storage.googleapis.com 存放區下載代理程式封存,然後將封存解壓縮到安裝目錄:

wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \
| sudo tar xzv -C /opt/cprof

GKE

修改服務容器 Dockerfile,以便建立要用來安裝 Profiler 的目錄,然後下載代理程式封存並將其解壓縮到安裝目錄:

RUN mkdir -p /opt/cprof && \
    wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \
    | tar xzv -C /opt/cprof

App Engine 彈性環境

Java 8 和 Java 9 的基本 Java 映像檔已隨附 Profiler 代理程式,因此不需要進行任何安裝。

App Engine 標準環境

Java 8 執行階段支援已涵蓋 Profiler 代理程式,因此不需要進行任何安裝。

載入 Profiler 代理程式

如要剖析程式碼,請按照程式正常執行方式啟動 Java,不過您要指定 agent-configuration 選項;請指定代理程式庫的路徑,並將選項傳送到該程式庫。

如果是在 App Engine 標準環境,系統會自動載入並設定代理程式。如要進一步瞭解如何設定及啟動程式,請直接跳到「啟動您的程式」一節。

代理程式設定

使用 -agentpath 選項來指定代理程式庫在安裝目錄中的路徑,並將額外設定傳送至該程式庫。

語法如下所示:

 -agentpath:[INSTALL_DIR]/profiler_java_agent.so=[OPTION1],[OPTION2],[OPTION3]

最常用的選項包括:

  • -cprof_service:要剖析的服務名稱。如要瞭解命名限制,請參閱服務名稱和版本引數一節。
  • -cprof_service_version:要剖析的服務版本 (選用)

如要剖析程式碼,請將 -agentpath 設定加到您的一般 Java 叫用中。舉例來說,想要執行並剖析 myApp.jar 的話,則最小叫用應為:

 java -agentpath:/opt/cprof/profiler_java_agent.so=-cprof_service=myapp -jar myApp.jar

堆積剖析

如要針對 Java 11 啟用堆積剖析,請將 -cprof_enable_heap_sampling 新增到您的 -agentpath。舉例來說,如要在啟用堆積剖析功能的情況下執行並剖析 myapp.jar,可使用如下叫用:

 java -agentpath:/opt/cprof/profiler_java_agent.so=-cprof_service=myapp,-cprof_enable_heap_sampling -jar myapp.jar

請參閱在 Stackdriver 產品中發現錯誤?一節,查看已知錯誤清單及回報錯誤相關資訊。

服務名稱和版本引數

載入 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

啟動程式

Compute Engine

按照程式正常執行方式來啟動 Java,並且新增 agent-configuration 選項:

java \
    -agentpath:/opt/cprof/profiler_java_agent.so=-cprof_service=myservice,-cprof_service_version=1.0.0 \
    [JAVA OPTIONS] -jar PATH/TO/YOUR/JARFILE [PROGRAM OPTIONS]

GKE

將服務容器 Dockerfile 修改為按照程式正常執行方式來啟動 Java,並且新增 agent-configuration 選項:

RUN java \
    -agentpath:/opt/cprof/profiler_java_agent.so=-cprof_service=myservice,-cprof_service_version=1.0.0 \
    [JAVA OPTIONS] -jar PATH/TO/YOUR/JARFILE [PROGRAM OPTIONS]

App Engine 彈性環境

修改 app.yaml 設定檔以設定 PROFILER_ENABLE 環境變數,然後再按照正常方式啟動程式:

env_variables:
   PROFILER_ENABLE: true

詳情請參閱「定義環境變數」。

App Engine 標準環境

app.yamlappengine-web.xml 設定檔修改為納入 GAE_PROFILER_MODE 環境變數來指示 Profiler 收集堆積剖析資料,頻率為針對同一個部署的所有執行個體平均每分鐘收集一次:

app.yaml:

env_variables:
   GAE_PROFILER_MODE: cpu,heap

appengine-web.xml:

  <env-variables>
    <env-var name="GAE_PROFILER_MODE" value="cpu,heap" />
  </env-variables>

然後再按照正常方式來啟動程式:

詳情請參閱「定義環境變數」。

代理程式記錄

如果是在 Compute Engine、GKE 和 App Engine 彈性環境,剖析代理程式可在記錄中報告偵錯資訊。如要啟用這項功能,請將 -logtostderr 標記附加到 -agentpath 設定:

 java -agentpath:/opt/cprof/profiler_java_agent.so=-cprof_service=myapp,-logtostderr -jar myApp.jar

後續步驟

如要進一步瞭解 Profiler 圖表和控制項,請參閱使用 Stackdriver Profiler 介面一文。如要瞭解進階資訊,請參考以下主題:

本頁內容對您是否有任何幫助?請提供意見:

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

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