疑難排解
本頁說明如何解決 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:
-
Enable the required API.
如果畫面顯示「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 專案:
如果服務是在 Google Cloud上執行,則系統會自動進行驗證,但您在 Compute Engine 上部署容器時除外。在 Compute Engine 上部署容器時,您必須在 Profiler 代理程式
start
指令中指定Google Cloud 專案 ID。如需操作說明,請參閱「將代理程式連結至 Google Cloud 專案」。如果您的服務是在 Google Cloud以外的環境執行,則必須建立服務帳戶,並將 Profiler 代理程式連結至Google Cloud 專案。詳情請參閱「剖析在 Google Cloud Platform 以外環境執行的應用程式 Google Cloud」。
」一文。
缺少特定類型的設定檔
本節列出特定設定,其中不會收集一或多個設定檔類型的設定檔。第一個部分包含一般內容,其餘部分則列出特定語言的問題。
一般資訊
如要查看特定設定檔類型,但沒有這類型的設定檔可用,請檢查下列事項:
確認應用程式的語言支援該設定檔類型。詳情請參閱「可用的剖析類型」。
變更要收集的設定檔類型後,請務必使用新版服務。如果您未指定新的服務版本,系統會使用現有的部署作業,而剖析代理程式無法轉移新啟用剖析類型的資料。如要進一步瞭解部署作業,請參閱「收集剖析資料」。
確認已啟用設定檔類型。系統預設會停用部分設定檔類型。詳情請參閱個別語言頁面:
本頁面的其餘部分會說明特定語言的設定,其中不包含某種設定檔類型的資料。
不適用:系統不會為 c-archives
收集 CPU 時間剖析資料
使用 -buildmode
標記 (設為 c-archive
或 c-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:沒有分叉程序的設定檔
剖析代理程式只能剖析啟動代理程式的程序。
如要解決這個問題,如果應用程式會分叉處理程序,且您想從分叉處理程序收集設定檔,請在分叉後初始化代理程式。