Fehlerbehebung
Auf dieser Seite wird beschrieben, wie Sie Probleme mit Cloud Profiler beheben.
Fehler bei der Konfiguration des Google Cloud-Projekts
In diesem Abschnitt sind mögliche Konfigurationsprobleme sowie Vorschläge zu deren Behebung aufgeführt.
Cloud Profiler API ist deaktiviert
Der folgende Fehler tritt auf, wenn die Profiler API nicht für Ihr Google Cloud-Projekt aktiviert ist:
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.
Um dieses Problem zu beheben, müssen Sie in Ihrem Google Cloud-Projekt die Profiler API aktivieren:
-
Enable the required API.
Wenn API aktiviert angezeigt wird, ist die API bereits aktiviert. Falls nicht, klicken Sie auf die Schaltfläche Aktivieren.
Aufrufender Nutzer hat keine Berechtigung
Der folgende Fehler tritt auf, wenn Sie nicht berechtigt sind, Profildaten in ein Google Cloud-Projekt zu schreiben:
failed to create a profile, will retry: rpc error: code = PermissionDenied desc = The caller does not have permission.
Um dieses Problem zu beheben, bitten Sie Ihren Administrator, Ihnen zusätzliche Berechtigungen für dieses Projekt zu gewähren. Eine detaillierte Liste der erforderlichen Berechtigungen und Rollen finden Sie unter Zugriffssteuerung.
Fehler mit Node.js
In diesem Abschnitt werden Probleme aufgeführt, die bei der Verwendung des Node.js-Profiling-Agents auftreten können. Sie erhalten außerdem Vorschläge zum Beheben der einzelnen Fehler.
Anwendung wird mit Node.js nicht korrekt beendet
Der Profiler-Agent für Node.js stört das normale Beenden des Programms. Es kann bis zu einer Stunde dauern, bis das Programm beendet ist, nachdem alle Aufgaben im Programm abgeschlossen wurden.
Um dieses Problem zu beheben, geben Sie ein SIGINT
-Signal aus, z. B. mit Ctrl-C
. Wenn Sie ein SIGINT
-Signal ausgeben, wird der Vorgang ordnungsgemäß beendet.
Fehler mit Python
In diesem Abschnitt werden Probleme aufgeführt, die bei der Verwendung des Python-Profiling-Agents auftreten können. Sie erhalten außerdem Vorschläge zum Beheben der einzelnen Fehler.
NotImplementedError
-Ausnahme mit Python
Die folgende Ausnahme wird mit der Funktion start
ausgegeben, wenn die Anwendung in einer Nicht-Linux-Umgebung ausgeführt wird:
NotImplementedError
Um dieses Problem zu beheben, führen Sie die Anwendung in einer Linux-Umgebung aus.
ValueError
-Ausnahme mit Python
Die folgende Ausnahme wird während start
ausgegeben, wenn die Funktionsargumente ungültig sind, notwendige Informationen nicht anhand der Umgebungsvariablen und -argumente ermittelt werden können oder wenn CPU-Zeit- und Echtzeitzeitprofile deaktiviert sind:
ValueError
Um dieses Problem zu beheben, prüfen Sie alle folgenden Punkte:
- Prüfen Sie, ob der Name und die Version des Dienstes die unter Argumente für Dienstnamen und -versionen definierten Anforderungen erfüllen.
- Wenn das Erstellen von Echtzeitprofilen aktiviert ist, sorgen Sie dafür, dass
start
vom Hauptthread aus aufgerufen wird. - Prüfen Sie, ob Sie eine unterstützte Version von Python verwenden und ob die Erstellung von CPU-Zeitprofilen bzw. Echtzeitprofilen aktiviert ist. Weitere Informationen finden Sie unter
start
-Funktion. - Prüfen Sie, ob Sie den Parameter
project_id
aufstart
festgelegt haben, wenn Sie die Anwendung außerhalb der GCP ausführen. Weitere Informationen finden Sie unterstart
-Funktion.
Ressource ist mit Python vorübergehend nicht verfügbar
Das Fehlerlog enthält nach der Aktivierung von Profiler folgende Einträge:
BlockingIOError: [Errno 11] Resource temporarily unavailable Exception ignored when trying to write to the signal wakeup fd
Diese Meldungen treten auf, wenn sich eine Anwendung mit dem Signal-Wakeup-Dateideskriptor signal.set_wakeup_fd
registriert.
Wenn der Zwischenspeicher der Dateibeschreibung gefüllt wird, wird standardmäßig eine Warnung in stderr protokolliert.
Wenn Cloud Profiler Profile erfasst, werden Signale mit hoher Frequenz ausgelöst, die dazu führen können, dass der Signaldateideskriptor gefüllt wird. Informationen zu diesem GitHub-Problem finden Sie unter BlockingIOError in App Engine.
Führen Sie einen der folgenden Schritte aus, um das Problem zu lösen:
Wenn Ihre Anwendung bei einem Verlust von Signalen sicher ausgeführt werden kann, können Sie Cloud Profiler verwenden. Wenn Sie Python 3.7 oder höher verwenden und die Warnmeldungen deaktivieren möchten, übergeben Sie
warn_on_full_buffer=False
als Parameter ansignal.set_wakeup_fd
.Wenn Ihre Anwendung bei einem Verlust von Signalen nicht sicher ausgeführt werden kann, sollten Sie Cloud Profiler nicht mehr verwenden. Eine weitere Verwendung kann den Verlust von Signalnummern und übermäßige Einträge im Fehlerlog nach sich ziehen.
Es sind keine Profile vorhanden
Wenn keine Profile angezeigt werden, hat dies meist eine der beiden folgenden Ursachen:
- Der Dienst wird nicht lange genug ausgeführt, um Profile erfassen zu können.
- Der Dienst ist nicht für die Authentifizierung konfiguriert.
Um Probleme im Zusammenhang mit einer kurzen Laufzeit zu beheben, achten Sie darauf, dass der Dienst mindestens drei Minuten kontinuierlich ausgeführt wird.
Zur Behebung von Problemen im Zusammenhang mit der Authentifizierung muss der Profiler-Agent Daten in Ihr Google Cloud-Projekt schreiben können:
Wenn Ihr Dienst in Google Cloud ausgeführt wird, erfolgt die Authentifizierung automatisch, es sei denn, Sie stellen einen Container in Compute Engine bereit. Wenn Sie einen Container in Compute Engine bereitstellen, müssen Sie Ihre Google Cloud-Projekt-ID im Profiler-Agent mit dem Befehl
start
angeben. Eine Anleitung finden Sie unter Agent mit einem Google Cloud-Projekt verknüpfen.Wenn Ihr Dienst außerhalb von Google Cloud ausgeführt wird, müssen Sie ein Dienstkonto erstellen und den Profiler-Agent mit Ihrem Google Cloud-Projekt verknüpfen. Weitere Informationen finden Sie unter Profilerstellung für Code außerhalb der Google Cloud Platform.
Profile eines bestimmten Typs sind nicht vorhanden
In diesem Abschnitt sind bestimmte Konfigurationen aufgeführt, mit denen Profile für einen oder mehrere Profiltypen nicht erfasst werden. Der erste Abschnitt bietet allgemeine Informationen dazu, die folgenden Abschnitte behandeln Probleme für bestimmte Sprachen.
Allgemeine Informationen
Wenn ein bestimmter Profiltyp angezeigt werden soll, aber keine Profile dieses Typs verfügbar sind, prüfen Sie Folgendes:
Der Profiltyp muss für die Sprache Ihrer Anwendung unterstützt werden. Weitere Informationen finden Sie unter Verfügbare Arten der Profilerstellung.
Prüfen Sie, ob Sie eine neue Dienstversion verwendet haben, nachdem der zu erfassende Profiltyp geändert wurde. Wenn Sie keine neue Dienstversion festlegen, wird eine vorhandene Bereitstellung genutzt und der Profiler-Agent kann die Daten für den neu aktivierten Profiltyp nicht übertragen. Weitere Informationen zu Bereitstellungen finden Sie unter Profilerfassung.
Der Profiltyp muss aktiviert sein. Einige Profiltypen sind standardmäßig deaktiviert. Weitere Informationen erhalten Sie auf den Seiten zu den einzelnen Sprachen:
In den folgenden Abschnitten auf dieser Seite werden sprachspezifische Konfigurationen beschrieben, mit denen keine Daten für einen bestimmten Profiltyp erfasst werden.
Go: CPU-Zeitprofile werden für c-archives
nicht erfasst
Wenn eine Go-Anwendung mit c-archive
oder c-shared
für das Flag -buildmode
erstellt wird, sind die CPU-Zeitprofile standardmäßig deaktiviert. Heap-, Konflikt- und Thread-Profile werden aber erfasst.
Weitere Informationen finden Sie unter GitHub issue #993: profiler not collecting CPU data for Go code in a c-archive.
Um dieses Problem zu beheben, müssen Sie die Erfassung von CPU-Zeitprofilen aktivieren, bevor Ihr Dienst profiler.Start
aufruft, sowie einen Aufruf von signal.Notify(make(chan os.Signal), syscall.SIGPROF)
hinzufügen.
Weitere Informationen zu signal.Notify
finden Sie unter func Notify
.
Java: Heap-Profile werden nicht erfasst, wenn mehrere Profiler aktiviert sind
Sie haben mehrere Heap-Profiler für eine Java-Anwendung aktiviert und es werden keine Profile erfasst.
Der Java-Heap-Sampler ist als Solo-Agent-Funktion aktiviert. Dies hat zur Folge, dass immer nur ein Profiler verwendet werden kann. Es wurde ein Programmfehler geöffnet, damit Java mehrere Heap-Profiler unterstützt. Informationen zu diesem Programmfehler finden Sie unter Multi-Agent-Unterstützung für den Heap-Sampling-Mechanismus hinzufügen.
Um dieses Problem zu beheben, aktivieren Sie einen Profiler.
Python: Keine CPU-Zeitprofile und keine Wall-Profile bei Verwendung von uWSGI vorhanden
Wenn uWSGI mehrere Worker zur Verarbeitung von Anfragen verwendet, wird die Anwendungsinitialisierung standardmäßig nur im Primärprozess (master
) durchgeführt. Die verzweigten Prozesse führen die Initialisierungssequenz nicht aus.
Wenn Sie den Profiler-Agent in der Initialisierungssequenz Ihrer Anwendung konfigurieren, konfigurieren Sie den Profiler-Agent in der AppConfig.ready()
-Methode einer Django-Anwendung. Dann wird der Profiler-Agent nicht für die verzweigten Prozesse konfiguriert.
Um dieses Problem zu beheben, führen Sie die Anwendungsinitialisierung in allen Worker-Vorgängen mit der Einstellung true
für das Flag lazy-apps aus.
Python: CPU-Zeitprofile vorhanden, aber keine Echtzeitprofile, wenn uWSGI verwendet wird
Der Wall-Profiler hängt vom Python-Signalmodul ab. Wenn der Python-Interpreter mit Threadunterstützung kompiliert wird, deaktiviert die Standardkonfiguration die benutzerdefinierte Signalverarbeitung für verzweigte Prozesse.
Um dieses Problem zu beheben, aktivieren Sie für uWSGI-Anwendungen die benutzerdefinierte Signalverarbeitung. Dazu legen Sie für das Flag py-call-osafterfork den Wert true
fest.
Python: Keine Profile für verzweigte Vorgänge vorhanden
Die Profiler-Agents können nur ein Profil für den Prozess erstellen, der den Agent gestartet hat.
Um dieses Problem zu beheben, sollten Sie den Agent nach der Verzweigung initialisieren, wenn Ihre Anwendung verzweigte Prozesse verarbeitet und Profile aus den verzweigten Prozessen erfasst werden sollen.