疑難排解
本頁說明如何解決 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. Roles required to enable APIs To enable APIs, you need the Service Usage Admin IAM role ( roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
- 如果畫面顯示「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:沒有分叉程序的設定檔
剖析代理程式只能剖析啟動代理程式的程序。
如要解決這個問題,如果應用程式會分叉處理程序,且您想從分叉處理程序收集設定檔,請在分叉後初始化代理程式。