疑難排解

本頁說明如何解決 Cloud Profiler 的問題。

Google Cloud 專案設定有誤

本節列出您可能會遇到的設定問題,並提供各項問題的修正建議。

Cloud Profiler API 已停用

如果未為 Google Cloud 專案啟用 Profiler API,就會發生下列錯誤:

failed to create a profile, will retry: rpc error: code = PermissionDenied
desc = Cloud Profiler API has not been used in project 012345 before or it is disabled.

如要解決這個問題, Google Cloud 專案必須啟用 Profiler API:

  1. Enable the required API.

    Enable the API

  2. 如果畫面顯示「API enabled」(API 已啟用),代表 API 已啟用。如果未顯示,請按一下「啟用」按鈕。

呼叫端沒有權限

如果沒有將剖析資料寫入 Google Cloud 專案的權限,就會發生下列錯誤:

failed to create a profile, will retry: rpc error: code = PermissionDenied
desc = The caller does not have permission.

如要解決這個問題,請要求管理員授予您該專案的額外權限。如需必要權限和角色的詳細清單,請參閱「存取權控管」一文。

Node.js 錯誤

本節列出使用 Node.js 剖析代理程式時可能會遇到的問題,並提供各項問題的修正建議。

應用程式無法透過 Node.js 正常結束

Node.js 的剖析代理程式會干擾程式的正常離開程序;程式中所有工作都完成後,終止程式可能需要花費長達一小時的時間。

如要解決這個問題,請發出 SIGINT 信號,例如使用 Ctrl-C。發出 SIGINT 信號時,程序會正常終止。

Python 發生錯誤

本節列出使用 Python 剖析代理程式時可能會遇到的問題,並提供各項問題的修正建議。

NotImplementedError 例外狀況 (Python)

在非 Linux 環境中執行應用程式時,系統會在執行 start 函式期間擲回下列例外狀況:

NotImplementedError

如要解決這個問題,請在 Linux 環境中執行應用程式。

ValueError 例外狀況 (Python)

當函式引數無效、無法從環境變數和引數判斷必要資訊,或 CPU 作業時間和實際時間剖析功能都停用時,start 會擲回下列例外狀況:

ValueError

如要解決這個問題,請檢查下列各項:

  • 確認服務名稱和版本符合「服務名稱和版本引數」中定義的需求。
  • 如果實際時間剖析功能已啟用,請確保 start 是從主執行緒呼叫。
  • 確保您使用的是受支援的 Python 版本,並且已啟用 CPU 作業時間或實際時間剖析功能。詳情請參閱 start 函式
  • 如果您是在Google Cloud以外的環境執行,請確認您已將 project_id 參數指定為 start。詳情請參閱 start 函式

Python 發生資源暫時無法使用錯誤

啟用 Profiler 後,錯誤記錄會包含下列項目:

BlockingIOError: [Errno 11] Resource temporarily unavailable
Exception ignored when trying to write to the signal wakeup fd

當應用程式向信號喚醒檔案描述元 signal.set_wakeup_fd 註冊時,就會出現這些訊息。根據預設,如果檔案描述元的緩衝區已滿,系統會將警告記錄到 stderr。

Cloud Profiler 收集設定檔時,會以高頻率觸發信號,導致信號檔案描述元填滿。如需 GitHub 問題,請參閱「BlockingIOError on App Engine」。

如要解決這個問題,請按照下列其中一種做法進行:

  • 如果應用程式在信號遺失時仍可安全執行,則可使用 Cloud Profiler。如果您使用 Python 3.7 以上版本,並想停用警告訊息,請將 warn_on_full_buffer=False 做為參數傳遞至 signal.set_wakeup_fd

  • 如果應用程式在訊號中斷時無法安全執行,建議您停止使用 Cloud Profiler。如果繼續使用,可能會導致訊號數量減少,且錯誤記錄中出現過多項目。

所有設定檔都遺失

如果沒有看到任何設定檔,常見原因有兩個:

  • 服務執行時間不夠長,無法收集設定檔。
  • 服務未設定驗證。

如要解決執行時間過短的問題,請確保服務持續執行至少 3 分鐘。

如要解決驗證相關問題,請確保剖析代理程式可以將資料寫入 Google Cloud 專案:

缺少特定類型的設定檔

本節列出特定設定,其中不會收集一或多個設定檔類型的設定檔。第一個部分包含一般內容,其餘部分則列出特定語言的問題。

一般資訊

如要查看特定設定檔類型,但沒有這類型的設定檔可用,請檢查下列事項:

本頁面的其餘部分會說明特定語言的設定,其中不包含某種設定檔類型的資料。

不適用:系統不會為 c-archives 收集 CPU 時間剖析資料

使用 -buildmode 標記 (設為 c-archivec-shared) 建構 Go 應用程式時,系統預設會停用 CPU 時間剖析功能。收集堆積、爭用情況和執行緒剖析資料。 詳情請參閱 GitHub 問題 #993:分析器未收集 C 封存檔中 Go 程式碼的 CPU 資料

如要解決這個問題,請在服務呼叫 profiler.Start 之前啟用 CPU 時間設定檔的收集作業,並新增對 signal.Notify(make(chan os.Signal), syscall.SIGPROF) 的呼叫。如要進一步瞭解 signal.Notify,請參閱func Notify

Java:啟用多個剖析器時,系統不會收集堆積剖析資料

您已為 Java 應用程式啟用多個堆積剖析器,但沒有任何設定檔。

Java 堆積取樣器已啟用為單一代理程式功能。因此一次只能使用一個剖析器。我們已開啟錯誤,將 Java 擴充為支援多個堆積剖析器。如要瞭解該錯誤,請參閱「Add multi-agent support for the Heap Sampling mechanism」。

如要解決這個問題,請啟用其中一個剖析器。

Python:使用 uWSGI 時沒有 CPU 作業時間,也沒有實際時間剖析

uWSGI 使用多個工作人員處理要求時,預設行為是在主要 (master) 程序中執行應用程式初始化作業。分叉程序不會執行初始化序列。

如果您在應用程式的初始化序列中設定剖析代理程式 (例如在 Django 應用程式的 AppConfig.ready() 方法中設定剖析代理程式),則剖析代理程式不會為分叉程序設定。

如要解決這個問題,請將 lazy-apps 旗標設為 true,在所有工作程序中執行應用程式初始化作業。

Python:使用 uWSGI 時有 CPU 作業時間剖析資料,但沒有實際時間剖析資料

Wall 分析器依附於 Python 訊號模組。使用執行緒支援編譯 Python 解譯器時,預設設定會停用分叉程序的自訂信號處理。

如要解決這個問題,請為 uWSGI 應用程式啟用自訂信號處理,方法是將 py-call-osafterfork 旗標設為 true

Python:沒有分叉程序的設定檔

剖析代理程式只能剖析啟動代理程式的程序。

如要解決這個問題,如果應用程式會分叉處理程序,且您想從分叉處理程序收集設定檔,請在分叉後初始化代理程式。