剖析概念

本頁面提供有關剖析的一般背景資訊、Stackdriver Profiler 可用的剖析類型及其他相關資訊。

什麼是剖析?

剖析是一種動態程式碼分析作業。也就是說,剖析可讓您在程式碼「執行期間」 (即「動態」部分) 擷取程式碼的特性,以便您掌握實際的資源使用情況或程式的效能特徵。

在開發和測試期間剖析程式碼,有助您最佳化程式碼設計並找出錯誤,降低實際運作時發生災難性失敗事件的風險。

剖析實際工作環境中的程式碼能協助您預測潛在問題發生的時機,並診斷可能出現的問題。

剖析不同於程式碼分析,前者會在收集執行中程式碼的統計資料時對程式加上額外的負載,而後者是檢查應用程式的原始碼 (並不是對運作中的應用程式進行檢查)。此外,剖析需要一個能從執行環境中收集和擷取相關統計資料的途徑;而這會對程式增加額外的負載。

收集剖析資料的方式很多,減少執行中應用程式額外負載的方式也不少。不過,這些方式通常需要在特性剖析的準確率和執行中應用程式的效能之間做取捨。

Stackdriver Profiler

Stackdriver Profiler 是一種統計型 (或取樣型) 分析器,不需要廣泛更動程式的程式碼也能收集資料。基本上,只要將一小段程式碼 (稱為「剖析代理程式」) 附加到程式碼,就能定期查看程式的呼叫堆疊,進而收集 CPU 或記憶體使用情況等相關資訊。

取樣分析器只取樣剖析特徵,因此準確率和精確度通常比較低,但對剖析的應用程式效能影響最小,這點對於持續剖析實際工作環境中的程式碼來說尤其重要。儘管只是統計上的約略值,但隨著樣本數增加,準確率也會隨之提升。

如要瞭解如何透過您的程式碼執行剖析代理程式,請參閱剖析 Go 程式碼剖析 Java 程式碼剖析 Node.js 程式碼剖析 Python 程式碼等說明文章。

收集 Profiler 資料之後,您可使用 Profiler 介面來進行分析。

可用的剖析類型

Stackdriver Profiler 支援的剖析類型因程式的撰寫語言而異。下表按語言列出支援的剖析類型:

剖析資料類型 Go1 Java Node.js Python
CPU 4
堆積 2
爭用情況
執行緒
實際時間 3 5

1 如果是 App Engine 標準環境,需要使用 Go 1.11 版或較新版本。
2 只適用於 App Engine 標準環境。
3 不適用於 App Engine 標準環境。
4 只適用於 Python 3.2 版和更高版本。
5 只適用於 Python 3.6 以上版本。

時間計算

  • CPU 時間是指 CPU 花費在執行程式碼區塊的時間。

  • 時鐘時間 (又稱「實際時間」) 是指執行程式碼區塊需要的時間。

函式的 CPU 時間能讓您知道在函式中執行特定程式碼需要多久的時間。這個指標會計算 CPU 忙於處理指令的時間,但不會計入 CPU 等候 (或處理其他指令) 的時間。

函式的時鐘時間是計算從進入到離開函式所經歷的時間,包含等候資料庫存取權解除鎖定、執行緒同步處理、鎖定等作業的時間。理論上,程式碼區塊的實際時間一定會比 CPU 時間長。

程式碼區塊有可能需要很長的執行時間,實際上卻只佔用少數 CPU 時間。如果實際時間值遠大於 CPU 時間值,這意味著程式碼花很多時間等候其他作業進行;而需要花大量時間等候其他作業完成的程式碼區塊可能會發生資源瓶頸,也就是有太多要求者嘗試存取部分有限的資源。

如果 CPU 時間與實際時間太相近,程式碼區塊就會耗用大量 CPU 資源;CPU 將佔去幾乎所有執行時間。長期執行的 CPU 密集型程式碼區塊可列入最佳化候選名單:是否有更能充分發揮 CPU 效益的方式可用來進行工作?比如說較少作業數或執行速度更快的做法?

Stackdriver Profiler 支援以下程式碼剖析 CPU 時間:

  • Go
  • Java
  • Python

Stackdriver Profiler 支援以下程式碼剖析時鐘/實際時間:

  • Java
  • Node.js
  • Python

堆積 (記憶體) 使用量

  • 堆積使用量 (又稱為「堆積」) 是指目前在程式堆積中分配到的記憶體。

  • 堆積分配量 (又稱為「堆積分配」) 是指在程式堆積中分配到的所有記憶體,包含不再使用的記憶體。

程式在執行時會用到記憶體;程式建立的物件會佔用空間,程式呼叫的函式也會佔用空間。

運作良好的程式會有效且適度地利用記憶體資源。程式會只使用需要的記憶體,不佔用大量記憶體空間;且不再需要記憶體時將釋回該記憶體空間,不致於平白流失。

假如程式使用比實際需求更多的記憶體,或不再需要時仍繼續佔用記憶體,啟動時速度可能會比較慢或逐漸變慢,甚至當機或影響到其他應用程式可用的資源。針對垃圾收集,如果程式分配記憶體的頻率多過實際需求,就會為垃圾收集器帶來更多工作。

剖析堆積使用量可協助您發現程式中潛在的效率低落及記憶體流失狀況。剖析堆積分配則有助於您掌握哪些分配項目會為垃圾收集器帶來最多工作。

Stackdriver Profiler 支援以下程式碼剖析堆積使用量:

  • Go
  • Node.js

Stackdriver Profiler 支援以下程式碼剖析堆積分配:

  • Go

執行緒資訊

建立執行緒的應用程式可能會遇到執行緒遭封鎖 (執行緒已建立但絕對不會實際執行),以及執行緒流失 (已建立的執行緒數量不斷增加) 的問題;前者是導致後者發生的其中一個可能原因。

Stackdriver Profiler 支援 Go 剖析執行緒使用情況。這個剖析資料會擷取有關 goroutine 和 Go 並行機制的資訊,而不擷取作業系統執行緒資訊。

爭用情況

在多執行緒程式中,等待共用資源存取權序列化可能會佔用大量時間。瞭解爭用行為有助調整程式碼設計,並掌握可用於效能微調的資訊。

Stackdriver Profiler 支援 Go 剖析互斥爭用情況。這可讓您判斷等候互斥情況排解所需要的時間,以及個別爭用情況發生的頻率。

收集剖析資料

針對所有剖析資料類型 (堆積使用量和執行緒使用量以外),一組剖析資料代表在單一 Compute Engine 區域中,針對已設定服務的單一執行個體每 10 秒收集一次的資料。系統平均每分鐘收集一次剖析資料。

這表示如果您有 10 個現行服務的執行個體,則在 10 分鐘期間內,系統大約會對每個執行個體取樣一次。其中有些採取隨機作業,因此在 10 分鐘期間內,您不一定會剛好看到 10 組剖析資料 (每個服務各一組)。

針對堆積使用量和執行緒剖析,每組剖析作業都是收集即時資料,而不是收集 10 秒期間內的資料;大約每分鐘收集一次。不同於堆積使用量剖析,堆積分配剖析作業是收集 10 秒期間內的資料。

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

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

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