Performance Analysis(Basic Profiler)

don9wan·2021년 10월 16일
0

Android

목록 보기
13/18
post-thumbnail
post-custom-banner

필자처럼 막코딩을 하다보면 앱이 쉽게 망가지기 일수다. 동일한 로직을 수행한다고 같은 앱이 아니다. 메모리 누수가 발생하는 필자의 앱은 분명 다를 것이다. 비효율적으로 로직을 수행하여 버벅거리는 앱 또한 다르다. 분명 좋지 않은 평을 받을 것이다. 이러한 결과를 방지하기 위해선 애플리케이션의 성능을 분석할 줄 알아야 한다. 오늘은 성능 분석/개선에 대해 간단하게 다뤄보려고 한다.

오늘도 역시 안드로이드 문서로 들어가보자.

문서 - 앱 성능 측정 개요


일반적인 앱 성능 저하 상황

Scroll Jank(스크롤 버벅거림)

  • 'Jank'는 요청된 케이던스(60hz 이상)로 화면에 그려지는 시간 내에 프레임을 빌드하고 제공할 수 없는 경우 발생하는 시각적 오류를 설명하기 위해 사용되는 용어입니다.
  • 앱은 렌더링 속도를 90Hz로 타겟팅해야 합니다. 기존의 렌더링 속도는 60Hz였지만, 많은 최신 기기가 스크롤과 같은 사용자 상호작용 중에 90Hz 모드로 작동하며, 일부 기기는 최대 120Hz의 더 높은 속도도 지원합니다.

Startup latency(시작 지연 시간)

  • 시작 지연 시간은 앱 아이콘, 알림 또는 기타 진입점을 탭한 후 사용자의 데이터가 화면에 표시되기까지 걸리는 시간입니다.
  • 앱에서는 다음 두 가지 시작 목표를 달성해야 합니다.
    • 500ms 이하의 콜드 스타트
      '콜드 스타트'는 시작된 앱이 시스템의 메모리에 존재하지 않을 때 나타납니다. 재부팅하거나 사용자 또는 시스템이 앱 프로세스를 종료한 후 앱을 처음 시작할 때 발생합니다. 반면 '웜 스타트'는 앱이 이미 백그라운드에서 실행 중일 때 발생합니다. 콜드 스타트는 모든 것을 저장용량에서 로드하고 앱을 초기화해야 하므로 시스템에서 대부분의 작업을 해야 합니다. 콜드 스타트는 500ms 이하를 목표로 합니다.
    • P95/P99 지연 시간이 중간 지연 시간에 매우 근접합니다. 앱을 시작하는 데 매우 오랜 시간이 걸리는 경우 사용자의 신뢰가 약화됩니다. 앱 시작의 중요한 경로에서 IPC와 불필요한 I/O에 잠금 경합이 일어나고 이러한 불일치가 초래될 수 있습니다.

Transitions that are not smooth(원활하지 않은 전환)

  • 이러한 문제는 탭 간 전환, 새 활동 로드와 같은 상호작용 중에 발생합니다. 이러한 유형의 전환에서는 애니메이션이 원활히 이루어져야 하며 지연이나 시각적 깜박임이 없어야 합니다.

Power inefficiencies(전력 비효율)

  • 작업을 하면 배터리가 소모되고 불필요한 작업은 배터리 수명을 줄입니다.
  • 코드에서 새 객체를 생성할 때 발생하는 메모리 할당으로 인해 시스템에서 상당한 작업이 발생할 수 있습니다. 이는 할당 그 자체에 ART의 노력이 필요할 뿐 아니라 나중에 이러한 객체('가비지 컬렉션')를 해제하는 데도 시간과 노력이 필요하기 때문입니다. 할당과 수집은 특히 임시 객체의 경우 전보다 훨씬 빠르고 효율적입니다. 따라서 예전에는 가급적 객체를 할당하지 않도록 안내했으나 현재는 앱과 아키텍처에 가장 적합한 방식을 따를 것을 권장합니다. 관리할 수 없는 코드의 위험을 감수하며 할당을 줄이는 방법은 ART(Android RunTime)의 기능을 고려했을 때 올바른 선택이 아닙니다.

문제 식별

성능 문제를 식별하고 해결하는 데 권장되는 work flow는 다음과 같습니다.

검사할 중요한 user journeys를 파악합니다.

  • 런처, 알림 등의 일반적인 시작 흐름
  • 사용자가 데이터를 스크롤하는 모든 화면
  • 화면 간 전환
  • 탐색 또는 음악 재생과 같은 장기 실행 흐름

디버깅 도구를 사용하여 이러한 흐름 중에 발생하는 상황을 검사합니다.

  • Systrace 또는 Perfetto: 정밀한 타이밍 데이터로 전체 기기에서 정확히 어떤 일이 일어나는지 확인할 수 있습니다.
  • 메모리 프로파일러: 힙에서 발생하는 메모리 할당을 확인할 수 있습니다.
  • Simpleperf: 특정 기간에 CPU를 가장 많이 차지하는 함수 호출의 flamegraph를 확인합니다. systrace에서 시간이 오래 걸리는 항목은 파악하지만 이유는 알 수 없는 경우 simpleperf를 통해 추가 정보를 확인할 수 있습니다.

오늘 알아볼 것은 문제 식별의 위 디버깅 도구들 중 하나인 프로파일러이다. Profile your app performance 해당 링크로 넘어가보자.


Android Profiler

위에서 알아본 앱 성능 저하 상황이 발생하면 우리는 무엇을 가장 먼저해야 할까? 바로 앱에서 CPU, 메모리, 그래픽, 네트워크, 기기 배터리와 같이 리소스를 비효율적으로 사용하는 영역을 확인하는 작업을 진행해야 한다. 이 때 Android 스튜디오에서는 잠재적 문제를 찾는 데 유용한 몇 가지 프로파일링 도구(프로파일러)를 제공한다.

  • CPU 프로파일러 : 런타임 성능 문제 추적
  • 메모리 프로파일러 : 메모리 할당 추적
  • 네트워크 프로파일러 : 네트워크 트래픽 사용량 모니터링
  • 에너지 프로파일러 : 배터리 소진에 영향을 미치는 에너지 사용 추적

또한 Jetpack의 Benchmark 라이브러리를 사용해 애플리케이션을 계측할 수도 있다.

  • Macrobenchmark : UI 애니메이션 또는 스크롤 같은 동작에 의해 트리거되는 애플리케이션 startup 및 redrawing 등의 성능 use case 측정
  • Benchmark : 특정 함수의 CPU 비용을 측정

Android studio는 애플리케이션의 하드웨어 리소스 사용 내역을 확인할 수 있는 프로파일링 도구인 Profiler를 제공한다. View > Tool Windows > Prefiler or Profile in Toolbar 를 클릭하여 프로파일러 창을 열 수 있다.

Android Profiler는 기기를 연결 해제하거나 End Session을 클릭할 때까지 프로파일링 데이터를 계속 수집한다고 한다.

  1. Android Profiler shows the process and device currently being profiled.
  2. In the Sessions pane, choose which session to view, or start a new profiling session.
  3. Use the zoom buttons to control how much of the timeline to view, or use the Attach to live button to jump to the real-time updates.
  4. The event timeline shows events related to user input including keyboard activity, volume control changes, and screen rotations.
  5. The shared timeline view, which includes graphs for CPU, memory, network, and energy usage.

2번은 보면 Sessions가 보인다. 세션이란 무엇일까?

Cookie vs Session

  • 공통점
    웹 통신에서 state(데이터)를 저장하기 위해 사용
  • 차이점
    저장위치, 저장형식, 용량제한, 만료시점 등
    • 쿠키 : 개인 PC에 저장됨
    • 세션 : 접속중인 웹 서버에 저장됨

이건 네트워킹에서의 Session이다. 상태 저장에 관련 된 것이 Session인 것 같다. Android Profiler에서 프로파일러 데이터를 세션으로 저장할 수 있다. 그리고 해당 세션은 Android studio를 종료할 때까지 유지된다. 프로파일링 정보를 여러 세션에 기록하고 세션 간을 전환하여 다양한 시나리오의 리소스 사용량을 비교할 수 있다.

  • 새로운 세션을 시작하려면 ➕
  • 현재 세션에 더 이상 프로파일러 데이터를 추가하지 않는다면 🟥
  • 이전의 Android 스튜디오 실행에서 내보낸 트레이스를 가져오려면 ➕ ->Load from file 선택

Level 2. Profiler

프로파일러의 기본 조작을 알아봤다면

CPU 프로파일러 : 런타임 성능 문제 추적
메모리 프로파일러 : 메모리 할당 추적
네트워크 프로파일러 : 네트워크 트래픽 사용량 모니터링
에너지 프로파일러 : 배터리 소진에 영향을 미치는 에너지 사용 추적

Profiler 2 에서 마저 알아보자.


이번 글은 여기서 마친다.

먼저 프로파일러를 통해 애플리케이션 성능을 분석하는 방법에 대해 알아야 한다. 프레임이 떨어진다거나, CPU, 메모리 등 리소스를 비효율적으로 사용되는 영역을 확인하고, 원인을 알아내어 수정할 수 있어야 한다.

현업에서 대부분 원인은 무거운 함수가 불필요하게 여러 번 불리는 것이 문제라고 한다. 이마저도 문제가 아니라면 해당 부하가 있는 작업을 비동기로 처리하는 방법을 사용해야 한다.

profile
한 눈에 보기 : https://velog.io/@dongwan999/LIST
post-custom-banner

0개의 댓글