프로필 유형 및 각 유형이 유용한 경우

Android에서는 여러 유형의 성능 프로필을 기록할 수 있습니다. 프로필을 수집하면 앱의 실행 속도, 사용되는 메모리 양, 소비되는 전력 등과 관련된 문제를 디버그하는 데 도움이 됩니다.

이 문서에서는 가장 유용한 프로필 유형과 일반적인 성능 문제를 디버깅하기 위해 각 프로필을 언제 사용해야 하는지 설명합니다.

시스템 트레이스

시스템 트레이스 예시
그림 1.: 시스템 추적 예시

시스템 트레이스는 프로세스, 스레드, 타이밍 정보, CPU 및 작업 실행, 시스템 또는 사용자 정의 이벤트에 관한 정보를 포함하는 강력한 프로필입니다.

앱 관점에서 트레이스의 정보는 지연 시간, 끊김 현상, 메모리, 배터리 등 다양한 영역에 걸쳐 있을 수 있습니다.

시스템 트레이스에는 시스템 또는 사용자가 정의할 수 있는 다음 코드 기반 이벤트가 포함됩니다. 코드 기반 이벤트는 사용자가 함수 호출을 통해 트리거할 수 있는 이벤트입니다.

  • 트레이스 슬라이스: 코드의 여러 지점 간 시간을 나타냅니다. Trace.beginSectionTrace.endSection API를 사용하여 추가할 수 있습니다.
  • 추적 카운터: 측정항목을 나타내는 숫자 값입니다(예: 힙 크기). Trace.setCounter API를 사용하여 추가할 수 있습니다.

시스템 트레이스에는 PerfettoSQL 쿼리에서 생성할 수 있고 분석을 실행하거나 트레이스를 비교하는 데 사용할 수 있는 측정항목도 포함되어 있습니다.

시스템 트레이스를 사용하여 다음 작업을 실행하는 것이 좋습니다.

  • 지연 시간 문제 진단 시스템 트레이스는 지연, 대기 또는 예약 문제로 인해 발생하는 지연 시간 문제를 찾는 데 유용합니다. 샘플 기반 프로필과 같은 다른 프로파일러는 시스템 트레이스에서 제공하는 타이밍 정보를 제공하지 않습니다.

  • 중복된 계산을 찾습니다. 추적을 통해 특정 계산이 반복되는지 확인할 수 있으며, 이는 불필요한 작업을 나타낼 수 있습니다.

  • 잠금 경합 문제 진단 스레드 상태와 리소스가 차단된 시점을 보여주는 슬라이스에 관한 정보를 사용하면 잠금(예: synchronized 블록)으로 인해 사용자 여정이 지연되는지 확인할 수 있습니다.

  • 앱의 멀티 스레딩 이해: 트레이스는 여러 스레드를 보여주며 각 스레드의 상태와 시스템 또는 앱에서 추가한 트레이스 슬라이스를 표시합니다. 이 멀티 스레드 뷰를 사용하면 활성 상태인 스레드, 절전 모드인 스레드, 실행 중인 스레드, 스레드 간 상호작용 방식을 파악할 수 있습니다.

  • 복잡한 실적 분석을 수행합니다. 강력한 사용자 인터페이스와 다양한 유형의 정보를 표시하는 기능을 통해 시스템 트레이스는 지연 시간, 메모리, 배터리 사용량 등 다양한 성능 문제를 디버깅하는 데 유용합니다.

시스템 트레이스는 PerfettoSQL을 사용한 쿼리도 지원합니다. 이 강력한 기능을 사용하면 다음 작업을 할 수 있습니다.

  • 특정 데이터 추출
  • 트레이스 데이터를 맞춤 측정항목으로 변환합니다.
  • 쿼리에서 디버그 트랙을 만들어 Perfetto UI에서 가장 관심 있는 항목을 더 쉽게 시각화할 수 있습니다.
  • Perfetto UI 내에서 직접 복잡한 분석을 수행합니다.

스택 샘플 프로필

스택 샘플
프로필 예시
그림 2.: 스택 샘플 프로필 예시

스택 샘플 프로필은 코드 실행 샘플을 기록하고 스레드가 CPU에서 작업을 실행하는 동안 설정된 비율로 호출 스택 정보를 저장하여 작동합니다. 이를 통해 실행 중에 코드가 수행하는 작업을 파악할 수 있습니다.

스택 샘플을 사용하여 다음 작업을 하는 것이 좋습니다.

  • 핫스팟 최적화 스택 샘플은 CPU 활동이 많은 코드 부분을 식별하는 데 도움이 됩니다. 즉, 스레드가 '실행' 상태에 있는 경우가 많습니다.
  • 코드 실행 이해하기 스택 샘플을 사용하면 코드베이스의 전반적인 동작을 파악할 수 있습니다.
  • 실행하면 안 되는 코드 식별 전혀 실행되지 않아야 하는 호출 스택을 발견할 수 있으며, 이는 즉각적인 최적화 기회를 나타냅니다.

힙 덤프

힙 덤프 예시
그림 3.: 힙 덤프 예시

Java 힙 덤프는 앱의 Java 힙 메모리의 스냅샷을 보여줍니다. 이 스냅샷에는 덤프가 생성된 시점의 모든 객체와 객체 간 참조가 포함됩니다.

다음 작업을 수행하려면 힙 덤프를 수집하는 것이 좋습니다.

  • 중복된 객체를 찾아냅니다. 힙 덤프는 라이브 객체 수를 보여주므로 중복된 객체를 추적하는 데 유용합니다. 또한 객체 참조를 제공하여 객체가 생성된 코드 위치를 정확히 파악할 수 있습니다.
  • 메모리 누수 찾기 힙 덤프는 덤프가 생성될 때 더 이상 사용되지 않아야 하는 메모리를 표시하여 잠재적인 메모리 누수를 나타낼 수 있습니다.
  • 최적화할 수 있는 객체를 식별합니다. 힙 덤프는 많은 메모리를 사용하는 객체와 그 수를 보여주므로 비효율적인 메모리 사용 패턴을 식별하는 데 도움이 됩니다.

힙 프로필

힙 프로필 예
그림 4.: 힙 프로필 예시

힙 프로필은 네이티브 버전과 Java 버전이 모두 있으며 메모리 문제를 디버깅하는 데 유용합니다. 메모리 할당 시 샘플을 가져온다는 점을 제외하면 호출 스택 샘플과 유사합니다.

힙 프로필을 사용하여 다음 작업을 실행하는 것이 좋습니다.

  • 메모리 급변 감소 힙 프로필은 메모리 할당의 코드 위치가 포함된 샘플을 제공합니다. 이를 통해 임시 객체를 많이 생성하는 영역을 식별할 수 있으며, 이는 앱에서 빈번한 가비지 컬렉션(GC)의 원인이 될 수 있습니다.
  • 메모리 누수 발견 힙 프로필은 다른 메모리 프로필과 함께 사용하여 메모리 누수를 진단하고 수정할 수 있습니다. 이를 통해 예상보다 훨씬 더 많은 메모리를 할당하는 위치를 정확히 파악할 수 있습니다.

프로필 결합

일반적으로 단일 프로필을 사용하여 성능을 분석합니다. 하지만 여러 프로필 또는 단일 결합 프로필을 수집하면 더 완전한 그림을 제공하고 단일 프로필만으로는 진단할 수 없는 복잡한 문제를 진단하는 데 도움이 되는 경우가 많습니다.

프로필을 결합하는 것이 유용한 시나리오를 고려해 보세요.

  • 시나리오 1: 계측되지 않은 코드 조사 시스템 트레이스에는 이미 계측한 작업의 지연 시간이 표시될 수 있습니다. 하지만 이러한 시간 동안 실행되는 계측되지 않은 코드 부분에 관한 정보가 더 필요할 수 있습니다. 조사하려면 호출 스택 프로필을 가져와 실행된 코드를 파악하세요. 이 정보를 사용하면 더 많은 추적 슬라이스를 추가하여 추적을 개선할 수 있습니다.

  • 시나리오 2: 메모리 누수 및 가비지 컬렉션 분석 할당으로 인해 Java 힙 메모리가 지속적으로 증가하여 가비지 컬렉션 (GC)이 자주 트리거되는 시스템 트레이스를 상상해 보세요. 할당된 객체를 이해하려면 힙 프로필이나 힙 덤프를 가져옵니다. 이러한 조합된 접근 방식을 사용하면 메모리 사용량을 줄이는 방법을 파악할 수 있습니다. 예를 들어 캐시를 사용하여 낭비되거나 최적화 가능한 할당을 줄이면 GC가 발생하지 않을 수 있습니다.