nyancoder

WWDC 2021 - Ultimate application performance survival guide 본문

WWDC/WWDC 2021

WWDC 2021 - Ultimate application performance survival guide

nyancoder 2021. 7. 31. 21:37

원본 영상: https://developer.apple.com/videos/play/wwdc2021/10181/

 

Introduction

  • 성능 지표를 추적하기 위한 주요 도구로 Xcode Organizer, MetricKit, Instruments, XCTest, App Store Connect API를 소개할 것입니다

  • 애플리케이션 성능에 대해 추적해야 할 핵심 지표는 배터리 사용량, 시작 시간, 멈추는 비율 , 메모리, 디스크 쓰기, 스크롤링, 종료, MXSignposts의 8가지가 있습니다.


Metrics and resolutions

  • 성능 지표에서 첫 번째 확인할 지표는 배터리 사용입니다.

  • 앱에서 배터리를 많이 소모하는 경우 사용자에게는 위와 같이 표시됩니다.
  • 배터리 UI에서 기기 전체 배터리 소모량과 앱의 사용 중 및 백그라운드의 활동을 보여줍니다.
  • 사용자는 기기를 오래 사용할 수 있는 앱을 주로 사용하기 때문에 배터리 사용량은 중요합니다.

  • 배터리 수명에 영향을 주는 항목은 여러 가지가 있으며, 그중 CPU, 네트워킹, 위치가 핵심적인 3가지입니다.

  • Xcode를 통해 코드를 앱을 실행하 중 디버그 탐색기를 통해서 관련 지표를 확인할 수 있습니다.
  • 에너지 게이지에서 CPU 사용량과 CPU Wake Overhead가 높은 영역을 확인할 수 있습니다.
  • CPU 사용률이 높은 경우는 CPU 사용량이 20% 이상인 경우입니다.
  • CPU Wake Overhead는 CPU가 유휴 상태에서 깨어나면서 에너지 비용이 발생하는 경우입니다.

  • MetricKit은 원격 성능 측정 프레임워크로 고객이 직면한 문제의 원인을 찾는 것을 도울 수 있습니다.

  • MetricKit을 사용하려면 앱에 MXMetricManagerSubscriber를 상속받은 AppMetrics라는 클래스를 정의하면 됩니다.
  • 클래스의 초기화 시에 자신을 MXMetricManager에 등록하고, 소멸할 때 자신의 참조를 제거합니다.
  • didReceive에서 전달받은 데이터를 처리할 수 있으며, 에너지 로그 및 CPU 사용량과 같이 Organizer에서 얻을 수 있는 정보들을 확인할 수 있습니다.

  • 사용자가 앱을 사용할 때 지표 수집을 동의한 기기에서 성능 데이터를 수집합니다.
  • 이 데이터를 Apple 서버에 집계한 다음 개발자가 Xcode Organizer와 같은 도구들을 확인할 수 있습니다.

  • 여기에서 배터리 사용량 측정항목을 선택하여 지난 16개의 앱 버전에서 수집된 데이터를 볼 수 있을 뿐만 아니라 하위 구성요소별 세부 분석도 우측 하단에서 볼 수 있습니다.

  • Xcode 13에 새로 추가된 회귀 창으로 이동하면 내 앱의 최신 버전에서 크게 증가한 측정항목 한 곳에서 확인할 수 있습니다.

  • Energy Organizer를 사용하여 동의한 사용자 장치에서 수집된 로그와 CPU 사용량이 많은 콜 스택을 확인할 수 있습니다.
  • App Store Connect API 통해 받은 JSON을 통해서 이 모든 데이터를 얻을 수 있습니다.

  • 250밀리 초 이상 사용자 입력에 응답하지 않는 경우, Hang Rate에 집계되며 이는 사용자 경험에 중대한 악영향을 줄 수 있습니다.

  • 스크롤 시에 표시될 다음 화면의 콘텐츠가 준비되지 않은 경우 스크롤이 끊깁니다.
  • 이 또한 사용자 경험에 악영향을 주기 때문에 최적화를 시작하기에 좋은 위치입니다.
  • 차트가 증가하거나 붉은색이 많아질수록 스크롤 경험이 좋지 않은 것을 나타냅니다.

  • Instrument도구를 사용하여 스레드 상태 또는 시스템 호출 추적을 사용하여 중단의 원인을 파악할 수 있습니다.
  • 스레드 상태 추적에서 스레드의 상태 타임라인과 OS가 스레드를 실행하거나 차단한 시간을 확인할 수 있습니다.

  • 시스템 호출 추적은 각 시스템 호출과 소요 시간을 보여줍니다.

  • XCTest로 스크롤 성능 테스트를 작성할 수 있습니다.
  • 위의 테스트에서는 scrollDeceleration 메트릭을 측정하도록 지정하고 빠른 스크롤 속도로 위로 스와이프 합니다.
  • 측정 블록은 기본적으로 5번 실행되므로 XCTMeasureOptions를 사용하여 각 실행 사이의 상태를 재설정할 수 있습니다.

  • MetricKit을 프로덕션 애플리케이션에 배포하면 이러한 문제 가 발생했을 때 원격 측정 및 진단을 수집할 수 있습니다.
  • iOS 14에서 MetricKit은 24시간 주기로 진단을 제공합니다.

  • iOS 15 및 macOS 12에서는 이제 문제가 발생한 직후 앱에서 중단을 포함한 모든 진단을 받게 됩니다.

  • iOS 15에 추가된 mxSignpostAnimationIntervalBegin API를 사용하여 애니메이션의 시작을 표시할 수 있습니다.
  • mxSignpost end API를 사용하여 애니메이션의 끝을 표시하고, 해당 간격 동안 발생하는 스크롤이 끊기는 문제를 원격 수집할 수 있습니다.
  • 이 두 호출 사이의 성능 데이터를 캡처할 뿐만 아니라 발생하는 모든 장애도 캡처합니다.

  • 디스크에 쓰기 작업은 사용자의 NAND를 마모시켜 장치 상태를 악화시킬 수 있습니다.
  • 쓰기도 시간이 많이 걸리고 자주 수행하면 사용자 경험과 성능이 저하될 수 있으므로, 쓰기는 한 번에 처리하는 것이 중요합니다.
  • Instruments의 파일 활동 템플릿을 사용하여 앱을 프로파일링 하면 파일 시스템을 사용하는 앱 코드의 위치를 ​​쉽게 알 수 있습니다.
  • 디스크 쓰기 작업을 개선하는 일반적인 방법은 쓰기 작업을 모아서 처리하고, 자주 변경되는 데이터는 Core Data를 사용하고, 잦은 파일 생성 및 삭제를 피하는 것입니다.

  • XCTest로 성능 테스트를 작성하여 과도한 디스크 쓰기가 있는 코드를 파악할 수 있습니다.
  • XCTStorageMetric의 인스턴스를 measureWithMetric API에 전달한 다음 디스크에 쓰는 코드를 호출하면 됩니다.
  • 테스트가 끝나면 해당 코드에 의해 디스크에 기록된 데이터의 양을 측정하고 Xcode 내에서 결과를 보여줍니다.
  • 테스트의 성공과 실패를 경정 지을 수 있는 디스크 쓰기 데이터양의 상한선을 설정할 수 있습니다.

  • Organizer를 사용하여 릴리즈 된 앱의 장치에서 성능을 추적할 수 있습니다.
  • 디스크 쓰기 지표는 이전 버전과 현재 버전의 디스크 쓰기 추세를 확인할 수 있으므로 급증하는 경우 버그가 있음을 알 수 있습니다.

  • 디스크 쓰기 보고서를 보면 문제가 있을 만한 디스크 쓰기가 일어나는 위치를 알 수 있습니다.
  • Insights 항목을 통해 문제의 개선을 위한 몇 가지 좋은 조언을 확인할 수 있습니다.

  • MetricKit을 사용하여 앱의 디스크 사용량을 모니터링하는 경우 MXSignpost으로 시작과 종료지점을 표시하여 보다 세분화된 원격 분석 정보를 얻을 수 있습니다.

  • 앱의 기동 시간은 사용자가 앱 아이콘을 택한 시점부터 첫 번째 프레임이 앱에서 렌더링 되기까지의 시간입니다.
  • 기동 시간은 사용자의 경험을 해칠 뿐 아니라, 기동 시간이 길어지면 시스템이 앱을 종료할 수 있습니다.

  • 앱이 시스템 메모리 제한에 도달하거나, 앱 시작 시 시간 초과와 같은 여러 가지 이유로 앱이 종료될 수 있습니다.
  • 앱이 종료되면 처음부터 다시 실행되어야 하므로 실행 시간이 오래 걸리며, 사용자 경험을 해칩니다.
  • 또한 종료 후 상태를 복원하지 않는 경우 사용자가 마지막 지점까지 찾아가는 번거로움을 줄 수 있습니다.

  • Organizer에서 시작 시간 및 종료 창을 통해서 앱이 실행되기까지의 속도를 할 수 있습니다.

  • 또한 앱이 종료되는 빈도를 확인할 수 있습니다.

  • Instruments의 앱 시작 시간 템플릿을 사용하여 앱의 시작 시간을 프로파일링 함으로써 이 문제를 테스트할 수 있습니다.
  • 이 템플릿은 5초 동안 앱을 실행하며, 그동안 진행되었던 시간 프로필과 스레드 상태 추적을 수집합니다.
  • XCTApplicationsLaunchMetric을 사용하여 성능 XCTest에서 시작 시간을 측정할 수도 있습니다.

  • 메모리는 앱, OS 및 커널 간의 공유 리소스입니다.
  • 앱이 메모리 제한을 초과하면 시스템에 의해 종료되며, 다음에 사용자가 실행하려고 할 때 처음부터 실행되어 실행 시간이 길어집니다.
  • 앱에 새로운 기능이 추가되면 Organizer의 Memory 및 Terminations 메트릭을 확인하여 메모리 사용이 급증하는지를 확인해야 합니다.

  • Instruments의 Leaks, Allocations 및 VM Tracker 템플릿을 사용하여 내 앱의 메모리 사용을 프로파일링 할 수 있습니다.
  • Leaks는 내 프로세스의 힙 을 검사하고 누수되는 메모리를 확인합니다.
  • Allocations는 앱의 메모리 수명 주기를 분석합니다.
  • VM Tracker는 시간에 따라 앱의 가상 메모리 공간을 보여줍니다.

  • MetricKit을 사용하여 동일한 정보를 얻고 이에 대한 분석을 수행할 수도 있습니다.
  • 중요한 코드의 주위에 MXSignposts를 지정하여 메모리 사용에 대한 보다 세분화된 측정을 할 수도 있습니다.

 

Next steps

  • 지난 몇 년 동안 개발자들은 이러한 도구를 사용하여 상당한 성능 최적화를 수행했으며 Snapchat이 대표적인 좋은 예입니다.
  • Snapchat은 작년에 99%의 비정상 종료를 줄였습니다.

 

Next Steps

  • Organizer를 사용하여 실행 시간과 비정상 종료를 확인해야 합니다.
  • Instruments의 시간 성능 측정 프로파일을 활용해야 합니다.
  • XCTests를 사용하여 성능 문제를 파악해야 합니다.
  • MetricKit를 App에 사용하여 보다 나은 성능 이슈를 측정해야 합니다.

 

목차: https://nyancoder.tistory.com/2

Comments