[Instruments 맛보기] 훌륭한 프로파일링 경험

2025. 9. 18. 21:39·iOS/Instruments
반응형

🏁 학습할 내용

  • os_signpost(Tracing)
  • struct to temporal data (Modeling)

🚥 os_signpost

 

⭐️  역할

저비용 추적에 사용되는 로깅 시스템

 

🔷 형태

  • swift는 begin, end, event라는 3가지 유형의 API를 제공
  • logHanlde은 사실상 nameSpace, subsystem과 category를 지정할 수 있음
  • static 이름과 함께 추적 지점의 논리적 구조와 계층 구조가 제공

 

👍 장점

 

동시성 환경에서도, 높은 수준으로 지원한다.

  • 시작 또는 종료 이벤트가 서로 다른 스레드여도, signpostID를 통해 이벤트를 일치시킬 수 있다.

 

높은 정확도의 타임스탬프가 기록된다.

 

 

비용이 저렴하다.

  • 최소한의 데이터만 저장
    • 정적 문자열 + 메타 데이터는 이진 텍스트 세그먼트에 오프셋으로 출력됨
  • 그렇기때문에, #DEBUG같은 걸로 분기를 따로 할필요가 없다. 

 

많은 정보를 제공한다.

  • 암묵적 정보
    • 시간
    • 스레드
    • 프로세스
    • 스코프
    • backtrace
  • 명시적 정보
    • event 타입
    • subsystem
    • category
    • name
    • id
    • format-string
    • message

 

✈️  모드

 

sdefault

  •  링 버퍼에 기록
  • 저렴한 비용

streaming

  • 실시간으로 instruments에 표시되는 모드
  • 높은 비용

dynmaic

  • 녹을 될때만 활성화
  • default보다 더 많은 정보를 얻는 대신, 오버헤드가 조금 더 있음, 하지만 여전히 저렴한 비용
  • dynamicTracing: 동적인 추적
  • dynamicStackTracing: dynamicTracing + 호출 스택
    let defaultLog = OSLog.default
    let dynamicTracingLog = OSLog(subsystem: "com.org.MyFramework", category: .dynamicTracing)
    let dynamicStackTracingLog = OSLog(subsystem: "com.org.MyFramework", category: .dynamicStackTracing)

 

🤔 어떻게 효율적으로 사용할 수 있을까?

 

지연 모드를 사용하자.

  • 스트리밍 모드(실시간 추적)은 항상 다른 모드 보다 높은 비용이 든다.
  • 템플릿을 열 때 설정할 ㅅ. 잇음

dynamic 모드를 사용하자.

  • 기본적으로 signpost가 꺼져 있기 때문에, 오버헤드를 최소화
  • 필요할 때, custom instruments에서만 활성화 가능
  • 내장된 OSSignpost의 트랙을 혼잡하게 만들지 않음 (노이즈 최소화)

 

생각보다 많은 개수를 넣어도 ㄱㅊ

  • 싱글 코어에서, 프로파일링에 사용하는 CPU 사용량을 1% 미만을 목표로 잡아보자.
  • 만약, 활성화된 signpost 약 0.5 마이크로 초라고 가정
  • 1초당 2만개의 signpost, 120프레임 기준, 약 83개 간격으로 표시할 정도로 여유

 

그렇다고 무분별한 사용은 하지말자

  • signpost는 시스템의 공유 자원이다.
  • 많이 사용할수록, 로깅시스템에 영향력이 커짐
  • 따라서, 여러 category로 구분하여, 필요한 부분만 빠르게 확인할 수 있도록 하자.

 

👍 모범 사례

 

시작한 간격은 반드시 끝내라

  • 시작한 Interval을 끝내지 않으면, 분석 속도가 크게 느려지고, 정확성이 매우 떨어짐
  • 좋은 방법은 defer 구분을 이용하면, 별도 코드 흐름을 크게 신경쓰지 않아도 된다.

추적 시작과 종료 지점에서 동일한 데이터를 기록을 피해라

  • 가능한 시작 지점에서 기록
  • 구분 값을 사용하고 싶으면, 차라리 Signpost ID를 생성해서 활용하자.
  • 중복 작업이 방지된 만큼, Instruments에서 가능한 빨리 값을 제공 받을 수 있음

signpost는 활성화되지 않은 상태에서 불필요한 작업을 피해라

  • signpostEnabled 플래그 속성을 활용해, 해당 시점에 기록중인 지 판단
  • 활성화 여부를 확인한 뒤, 작업을 진행하는 것이 효율적

Instruments에 필요한 데이터만 추적해라


📊 modeling and adding structure to data within Instruments

 

🏗️ Instruments Architecture

 

Instruments의 모든 내용은 테이블에 저장된 내용을 기반으로 동작한다.

schema는 테이블의 구조를 정의하며, 모든 테이블은 Instruments Instant Analysis Core을 통해 측정됨

 

이제 각 과정을 살펴보자.

 

Tracing

  • 앞에서 배운 Tracing은 데이터 소스를 기록하는 과정

 

Modeling

  • 모델링은 중간 단계이며, 모델러는 하나 이상의 입력 테이블에서 데이터를 관찰한 후, 이유를 추론한다.
  • 이후 사용자가 지정한 하나 이상의 출력 테이블에 데이터를 출력한다.
  • 모델러는 도메인별 로직이 있는 곳이며, 출력 테이블의 스키마는 데이터에 적용할 유형과 포맷터를 지정하는 데 사용된다.

 

Visualization

 

 

  • 마지막 단계는 모델러의 출력 테이블 데이터를 그래프로 표시하고, 표시 방법을 지정하는 단계
  • 예를 들어, 어떤 열을 그릴 지, 어떤 값을 사용할지, 어떤 색상 레이블로 표시할 지를 지정할 수 있다.

⚠️ 커스텀 Instruments 만들 떄 주의할 점

 

OSSignpost확인과 스키마 매핑

  • 커스텀 Instruments의 Visualization은 스키마와 모델러의 출력을 기반으로 한다
  • 그렇기 떄문에, OSSignpost 추적 상태가 양호한지, 데이터를 사용자 스킴으로 정의하는 과정을 확인하는 것은 매우 중요!

 

데이터 저장 방식

  • 커스텀 Instruments는 반드시, 두가 지 방식 중 하나를 채택해야함
    • Point Schema: timestamp 열만 필요 (단일 시점 이벤트)
    • Interval Schema: timesatmp와 duration 열이 필요 (기간이 있는 이벤트)
  • 최소 하나 이상의 Point 또는 Interval schema를 정의하고, 나머지 열들은 이름과 데이터 타입을 직접 제공

 

모데링 규칙 정하기

  • 규칙은 Eclipse 언어로 표현된다.
  • 다행히 Instruments는 모델러를 자동 생성하는 몇가지 shcema를 제공
  • 따라서, 직접 Eclipse 코드까지 짤 경우는 많이 없다.

 

실제 데이터가 정확한지 확인하기

  • Instruments 라이브러리에 내장된 OSSignpost 도구를 사용하면, 간격과 데이터 예상값의 정확도를 살펴볼 수 있다.

출처

https://developer.apple.com/videos/play/wwdc2019/414/

반응형

'iOS > Instruments' 카테고리의 다른 글

[Instruments 맛보기] SwiftUI 성능 최적화  (0) 2025.10.19
[Instruments 맛보기] Swift Concurrency 시각화 및 최적화하기  (0) 2025.09.23
[Instruments 맛보기] HTTP 트래픽 분석  (0) 2025.09.20
[Instruments 맛보기] 배터리 수명 및 성능 향상시키기  (0) 2025.09.15
[Instruments 맛보기] 프롤로그  (0) 2025.09.13
'iOS/Instruments' 카테고리의 다른 글
  • [Instruments 맛보기] Swift Concurrency 시각화 및 최적화하기
  • [Instruments 맛보기] HTTP 트래픽 분석
  • [Instruments 맛보기] 배터리 수명 및 성능 향상시키기
  • [Instruments 맛보기] 프롤로그
Hamp
Hamp
남들에게 보여주기 부끄러운 잡다한 글을 적어 나가는 자칭 기술 블로그입니다.
  • Hamp
    Hamp의 분리수거함
    Hamp
  • 전체
    오늘
    어제
    • 분류 전체보기 (325) N
      • CS (30)
        • 객체지향 (2)
        • Network (7)
        • OS (6)
        • 자료구조 (1)
        • LiveStreaming (3)
        • 이미지 (1)
        • 잡다한 질문 정리 (0)
        • Hardware (2)
        • 이론 (6)
        • 컴퓨터 그래픽스 (0)
      • Firebase (3)
      • Programing Langauge (41)
        • swift (34)
        • python (6)
        • Kotlin (1)
      • iOS (133) N
        • UIKit (37)
        • Combine (1)
        • SwiftUI (33) N
        • Framework (7)
        • Swift Concurrency (22)
        • Tuist (6)
        • Setting (11)
        • Modularization (1)
        • Instruments (6)
      • PS (59)
        • 프로그래머스 (24)
        • 백준 (13)
        • LeetCode (19)
        • 알고리즘 (3)
      • Git (18)
        • 명령어 (4)
        • 이론 (2)
        • hooks (1)
        • config (2)
        • action (7)
      • Shell Script (2)
      • Linux (6)
        • 명령어 (5)
      • Spring (20)
        • 어노테이션 (6)
        • 튜토리얼 (13)
      • CI-CD (4)
      • Android (0)
        • Jetpack Compose (0)
      • AI (9)
        • 이론 (9)
        • MCP (0)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    SwiftUI
    boostcamp
    백준
    투포인터
    property
    lifecycle
    Spring
    IOS
    protocol
    프로그래머스
    Swift
    dispatch
    dp
    CS
    concurrency
    GIT
    Tuist
    UIKit
    AVFoundation
    dfs
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.0
Hamp
[Instruments 맛보기] 훌륭한 프로파일링 경험
상단으로

티스토리툴바