-
Swift Profile RecorderSwift 2025. 10. 12. 08:24
안녕하세요. 그린입니다 🍏
이번 포스팅에서는 Apple이 오픈소스로 공개한 Swift Profile Recorder에 대해 정리해보려 합니다.
프로덕션 환경에서 성능 문제를 진단하는 새로운 도구인데요.
실제로 Apple이 수년간 대규모 Swift 서비스 운영에 사용해온 도구입니다 🙋🏻

Swift Profile Recorder란?
Swift Profile Recorder는 Swift 서비스를 위한 인프로세스 샘플링 프로파일러입니다.
이제 오픈소스 프로젝트로 공개되어 누구나 사용할 수 있게 되었습니다.
프로파일링은 애플리케이션의 성능, 리소스 사용량, 동작을 이해하기 위한 방법입니다.
Swift Profile Recorder를 사용하면 패키지 의존성만 추가하면 되고 추가 설정이 필요 없어요.
주요 특징
1. 특별한 권한이나 시스템 의존성 없이 프로파일링 도입 가능
- 제한된 권한을 가진 다양한 컴퓨팅 환경에서 프로파일링을 추가할 수 있습니다.
2. curl로 샘플 수집
- perf, sample, DTrace, eBPF(bpftrace) 같은 특정 툴을 익힐 필요 없이 HTTP 엔드포인트를 통해 프로파일러 출력을 쉽게 읽을 수 있습니다.
3. 기존 시각화 및 분석 도구와 통합
- Linux perf script 형식
- pprof 파일 형식 및 /debug/pprof/profile 엔드포인트
- FlameGraphs에서 사용하는 collapsed 형식 등 여러 업계 표준 형식을 지원합니다.
Apple은 수년간 프로덕션 환경에서 Swift 서비스를 운영하고 디버깅하는 도구로 Swift Profile Recorder를 대규모로 사용해왔습니다.
프로파일링이란 무엇이고 왜 중요할까?
프로파일링을 통해 Swift 애플리케이션이 시간을 어디에 소비하는지 이해할 수 있습니다.
계산 작업인지, 락 획득을 기다리는 것인지, 파일 I/O에서 블록되어 있는지 등을 파악할 수 있죠.
기존 프로파일링 도구들의 제약사항
운영체제에는 애플리케이션이나 전체 시스템을 프로파일링할 수 있는 도구가 있습니다.
- Apple의 Instruments, sample
- Linux의 perf
- DTrace나 eBPF 같은 커널 시스템
최근 커뮤니티에서 기여한 swift-parca는 Parca Agent와 연결되어 Linux의 eBPF를 활용하여 애플리케이션을 지속적으로 프로파일링합니다.
다만 여기에는 몇 가지 제약사항이 있습니다.
- 다른 프로세스에 연결하거나 eBPF/DTrace 프로그램을 커널에 로드하려면 특별한 권한이 필요
- Linux 배포판에서 이 기능을 활성화하려면 추가 컴포넌트가 필요할 수 있음
- 운영체제마다 사용 가능한 프로파일링 기술이 크게 다름
Swift Profile Recorder의 접근 방식
더 많은 팀이 애플리케이션을 프로파일링할 수 있도록, Swift Profile Recorder는 다른 접근 방식을 취합니다.
프로세스 내부에서 실행되며 Swift Package로 구현되었습니다.
이는 외부 프로파일링 도구가 작동할 수 없는 환경에서도 코드를 프로파일링할 수 있다는 의미입니다.
다른 시스템 컴포넌트를 설치할 필요가 없고, 추가 권한이 필요하지 않으며, 다양한 운영체제에서 작동할 수 있습니다.
현재 Swift Profile Recorder는 macOS와 Linux를 지원합니다.
Apple에서 Swift 서비스 프로파일링하기
Apple은 서버에서 Swift를 광범위하게 사용하여 대규모 스토리지와 컴퓨팅을 제공하는 분산 시스템을 구축합니다. 이러한 시스템은 Apple 운영체제 개발을 위한 빌드 및 테스트 인프라를 지원합니다.
클라이언트 워크로드가 레이턴시에 민감하기 때문에, 성능 병목 지점을 이해하기 위해 코드를 추가로 계측할 필요가 있었습니다.
이 인프라는 eBPF와 같은 도구에 접근할 수 없는 샌드박스 환경에서 실행됩니다.
또한 인프라의 일부 컴포넌트는 macOS에서 실행됩니다.
그래서 최적화되지 않은 코드에 대한 더 나은 인사이트를 얻기 위해 Swift Profile Recorder를 구축했습니다.
두 가지 사용 방식
1. 특정하고 격리된 성능 회귀 인스턴스를 안전하게 진단
2. 인프라 전체에서 대량의 샘플을 수집하여 공통 패턴 식별 (Continuous Profiling)
사용법
애플리케이션에 Swift Profile Recorder를 추가하는 것은 최소한의 설정만 필요합니다.
1. Package.swift에 의존성 추가
// Package.swift에서 .package(url: "https://github.com/apple/swift-profile-recorder.git", .upToNextMinor(from: "0.3.0")) // 타겟 의존성에서 .product(name: "ProfileRecorderServer", package: "swift-profile-recorder")2. 애플리케이션의 main 함수에서 시작
import ProfileRecorderServer @main struct YourApp { func run() async throws { // 백그라운드에서 프로파일링 서버 시작 async let _ = ProfileRecorderServer( configuration: .parseFromEnvironment() ).runIgnoringFailures(logger: logger) // 애플리케이션 코드는 여기서 계속됩니다 } }3. 환경 변수를 통해 프로파일링 활성화
configuration: .parseFromEnvironment()를 지정했다면, 프로파일링 서버를 활성화하기 위해 환경 변수를 설정해야 합니다.
PROFILE_RECORDER_SERVER_URL_PATTERN=unix:///tmp/my-app-samples-{PID}.sock ./my-app4. 간단한 curl 명령으로 샘플 수집
curl --unix-socket /tmp/my-app-samples-12345.sock \ -sd '{"numberOfSamples":1000,"timeInterval":"10ms"}' \ http://localhost/sample | swift demangle --compact > samples.perf정말 간단하지 않나요? 패키지 추가하고 몇 줄만 작성하면 바로 프로파일링을 시작할 수 있습니다!
시각화 및 통합
생성된 프로파일은 여러 시각화 도구들과 원활하게 작동합니다.
1. Speedscope (speedscope.app)
.perf 파일을 드래그 앤 드롭하면 즉시 flame graph 시각화를 볼 수 있습니다.
2. Firefox Profiler (profiler.firefox.com)
프로파일을 업로드하여 상세한 타임라인 분석을 할 수 있습니다.
3. 전통적인 FlameGraph 도구
Brendan Gregg의 원본 FlameGraph 스크립트를 사용하여 커스텀 시각화를 만들 수 있습니다.
4. 기타 도구들
일반적인 .perf, .pprof 또는 stack collapsed 형식과 호환되는 많은 다른 도구들을 사용할 수 있습니다.
실제 예시
Hummingbird의 hello 예제를 macOS에서 실행하여 Speedscope에서 시각화한 예시도 제공됩니다.
Swift Profile Recorder는 Parca와 Pyroscope로 샘플을 보내는 소스로도 사용할 수 있습니다.
프로덕션 환경에서 eBPF를 사용한 시스템 전체 프로파일링을 설치할 수 있다면, Parca Agent와 swift-parca를 함께 사용하는 것을 권장합니다.

실제 적용 케이스
Swift Profile Recorder가 유용한 상황들을 정리해볼까요?
1. 권한 제약이 있는 환경
// 샌드박스 환경이나 컨테이너 환경에서도 동작 // eBPF나 DTrace 접근 권한이 없어도 OK import ProfileRecorderServer @main struct SandboxedApp { func run() async throws { // 특별한 시스템 권한 없이 프로파일링 시작 async let _ = ProfileRecorderServer( configuration: .parseFromEnvironment() ).runIgnoringFailures(logger: logger) try await runYourService() } }2. 성능 회귀 디버깅
# 특정 인스턴스에서 성능 문제가 발생했을 때 # 즉시 프로파일 수집 가능 # 1000개의 샘플을 10ms 간격으로 수집 curl --unix-socket /tmp/my-app-samples-12345.sock \ -sd '{"numberOfSamples":1000,"timeInterval":"10ms"}' \ http://localhost/sample | swift demangle --compact > regression.perf # Speedscope에서 열어서 병목 지점 확인3. Continuous Profiling
# 정기적으로 샘플을 수집하여 패턴 분석 # cron job이나 스케줄러로 자동화 가능 #!/bin/bash # 매시간 프로파일 수집 while true; do timestamp=$(date +%Y%m%d_%H%M%S) curl --unix-socket /tmp/my-app-samples-*.sock \ -sd '{"numberOfSamples":500,"timeInterval":"10ms"}' \ http://localhost/sample | swift demangle --compact > "profile_${timestamp}.perf" sleep 3600 done4. 다중 환경 지원
// macOS 개발 환경과 Linux 프로덕션 환경 모두에서 동작 #if os(macOS) let profilePath = "/tmp/dev-samples-{PID}.sock" #elseif os(Linux) let profilePath = "/var/run/prod-samples-{PID}.sock" #endif let config = ProfileRecorderServerConfiguration( urlPattern: "unix://\(profilePath)" )
Conclusion
핵심을 정리해볼까요?
Swift Profile Recorder의 강점
- 🔓 특별한 권한 없이 프로파일링 가능
- 📦 간단한 패키지 의존성으로 도입
- 🌍 macOS와 Linux 모두 지원
- 🛠 다양한 시각화 도구와 호환
- 💪 Apple이 수년간 대규모로 검증한 도구
언제 사용하면 좋을까?
- 샌드박스나 컨테이너 환경에서 개발
- macOS에서 서버 애플리케이션 실행
- eBPF/DTrace 권한을 얻기 어려운 환경
- 빠르게 프로파일링을 도입하고 싶을 때
- 특정 인스턴스의 성능 문제를 진단할 때
개인적으로 가장 인상 깊은 점은 Apple이 실제로 대규모 인프라에서 사용해온 도구를 오픈소스로 공개했다는 것입니다.
특히 샌드박스 환경이나 권한 제약이 있는 환경에서 프로파일링을 할 수 있다는 점이 매우 실용적이라고 생각합니다.
여러분의 프로덕션 환경에서도 성능 병목 지점을 찾는 데 Swift Profile Recorder가 유용하게 쓰일 것 같네요! 🚀
References
Introducing Swift Profile Recorder: Identifying Performance Bottlenecks in Production
Introducing Swift Profile Recorder: Identifying Performance Bottlenecks in Production
www.swift.org
Swift Profile Recorder
Swift Profile Recorder, an in-process sampling profiler.
forums.swift.org
'Swift' 카테고리의 다른 글
Swift SDK for Android - Android 앱을 Swift로 개발하기 (0) 2025.10.26 Iterate Over Parameter Packs (0) 2025.10.18 Swift 6.2 (0) 2025.10.02 Deep Dive @_silgen_name (1) 2025.09.20 Swift Collections 내부 구조 분석 (0) 2025.09.06