문제 해결

이 페이지에서는 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 사용 설정됨이 표시되어 있으면 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용 프로파일링 에이전트는 프로그램의 정상 종료를 방해합니다. 따라서 프로그램의 모든 태스크가 완료된 후 프로그램이 종료되기까지 최대 1시간이 소요될 수 있습니다.

이 문제를 해결하려면 Ctrl-C를 사용하여 SIGINT 신호를 보냅니다. SIGINT 신호를 보내면 프로세스가 정상적으로 종료됩니다.

Python 오류

이 섹션에서는 Python 프로파일링 에이전트를 사용할 때 발생할 수 있는 문제를 나열하고 각 문제를 해결하는 방법을 제안합니다.

Python의 NotImplementedError 예외

Linux 이외의 환경에서 애플리케이션을 실행할 때 start 함수를 실행하는 동안 다음 예외가 발생합니다.

NotImplementedError

이 문제를 해결하려면 Linux 환경에서 애플리케이션을 실행하세요.

Python의 ValueError 예외

필요한 정보가 환경 변수와 인수에서 결정되지 않거나 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

이러한 메시지는 애플리케이션이 신호 wakeup 파일 설명자 signal.set_wakeup_fd로 등록될 때 발생합니다. 기본적으로 파일 설명자의 버퍼가 채워지면 stderr에 경고가 로깅됩니다.

Cloud Profiler는 프로필을 수집할 때 높은 빈도로 신호를 트리거하며 신호 파일 설명자가 채워질 수 있습니다. GitHub 문제는 App Engine의 BlockingIOError를 참조하세요.

이 문제를 해결하려면 다음 중 한 가지를 따르세요.

  • 신호가 손실될 때 애플리케이션을 안전하게 실행할 수 있으면 Cloud Profiler를 사용할 수 있습니다. Python 3.7 이상을 사용 중이고 경고 메시지를 사용 중지하려면 warn_on_full_buffer=Falsesignal.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 외부에서 프로파일링을 참조하세요.

특정 유형의 프로필이 누락됨

이 섹션에는 하나 이상의 프로필 유형에 대한 프로필이 수집되지 않는 특정 구성이 나열되어 있습니다. 첫 번째 섹션에는 일반적인 콘텐츠가 포함되며 나머지 섹션에서는 특정 언어에 대한 문제가 나열되어 있습니다.

일반 정보

특정 프로필 유형을 보려는 경우 해당 유형의 프로필이 없으면 다음을 확인합니다.

이 페이지의 나머지 섹션에서는 하나의 프로필 유형에 대한 데이터가 수집되지 않는 언어별 구성에 대해 설명합니다.

Go: c-archives의 CPU 시간 프로필이 수집되지 않음

-buildmode 플래그가 c-archive 또는 c-shared로 설정된 Go 애플리케이션이 빌드되면 CPU 시간 프로파일링이 기본적으로 사용 중지됩니다. 힙, 경합, 스레드 프로필이 수집됩니다. 자세한 내용은 GitHub 문제 #993: 프로파일러가 c-archive에서 Go 코드의 CPU 데이터를 수집하지 않음을 참조하세요.

이 문제를 해결하려면 서비스에서 profiler.Start을 호출하기 전에 CPU 시간 프로필 수집을 사용 설정하고 signal.Notify(make(chan os.Signal), syscall.SIGPROF)에 호출을 추가합니다. signal.Notify에 대한 자세한 내용은 func Notify를 참조하세요.

자바: 여러 프로파일러가 사용 설정된 경우 힙 프로필이 수집되지 않음

자바 애플리케이션에 대해 여러 힙 프로파일러를 사용 설정했으며 프로필이 없습니다.

자바 힙 샘플러는 솔로 에이전트 기능으로 사용 설정됩니다. 그 결과 한 번에 하나의 프로파일러만 사용할 수 있습니다. 자바를 확장하여 여러 힙 프로파일러를 지원하도록 버그가 열렸습니다. 이 버그에 관한 자세한 내용은 힙 샘플링 메커니즘용 멀티 에이전트 지원 추가를 참조하세요.

이 문제를 해결하려면 한 개의 프로파일러를 사용 설정하세요.

Python: uWSGI를 사용할 때 CPU 시간 및 월 프로필 없음

uWSGI가 여러 작업자를 사용하여 요청을 처리하는 경우 기본 동작은 기본(master) 프로세스에서만 애플리케이션 초기화를 수행하는 것입니다. 포크된 프로세스는 초기화 시퀀스를 수행하지 않습니다.

예를 들어 애플리케이션의 초기화 시퀀스에서 프로파일링 에이전트를 구성하는 경우, Django 애플리케이션의 AppConfig.ready() 메서드에서 프로파일링 에이전트를 구성하면 프로파일링 에이전트는 포크된 프로세스를 위해 구성되지 않습니다.

이 문제를 해결하려면 lazy-apps 플래그를 true로 설정하여 모든 작업자 프로세스에서 애플리케이션 초기화를 수행합니다.

Python: uWSGI를 사용할 때 CPU 시간 프로필이 있지만 월 프로필은 없습니다.

실제 경과 시간 프로파일러는 Python 신호 모듈에 따라 다릅니다. Python 인터프리터가 스레드 지원과 함께 컴파일되면 기본 구성이 포크된 프로세스의 커스텀 신호 처리를 사용 중지합니다.

이 문제를 해결하려면 uWSGI 애플리케이션의 경우 플래그 py-call-osafterforktrue로 설정하여 커스텀 신호 처리를 사용 설정합니다.

Python: 포크된 프로세스의 프로필이 없음

프로파일링 에이전트는 에이전트를 시작한 프로세스만 프로파일링할 수 있습니다.

이 문제를 해결하려면 애플리케이션이 프로세스를 포크하고 포크된 프로세스에서 프로필을 수집하고 싶다면 포크 후에 에이전트를 초기화합니다.