Trawling
발견 출처 Reddit/발행

The State of Python Profiling in 2026

Austin 4.1, asyncio 작업별 실행과 대기 흐름을 타임라인으로 추적

Austin 4.1.0은 CPython 3.14 이상에서 asyncio 작업과 await 관계를 연결해 작업별 실행·대기 흐름을 보여줍니다. 함수별로 시간을 합산하는 flame graph가 놓치는 지연 원인을 VS Code 확장 프로그램의 작업 타임라인에서 살펴볼 수 있습니다.

본문

Austin 유지관리자 Gabriele N. Tornetta는 2026년 10월 30일 Python 프로파일러 현황과 Austin 4.1을 정리한 글을 공개했습니다. 프로젝트 저장소의 v4.1.0 릴리스에는 CPython 3.14 이상에서 asyncio 작업을 추적하는 기능이 포함됐습니다. Austin은 작업별 샘플과 await 관계를 기록해 작업이 실제로 실행한 시간과 다른 작업을 기다린 시간을 시간 흐름에 따라 보여줍니다.

함수별 합계에서 작업의 흐름으로

샘플링 프로파일러는 일정 간격으로 프로그램의 실행 스택을 읽습니다. Austin은 CPython 프로세스 바깥에서 인터프리터 메모리를 살펴 샘플을 MOJO라는 바이너리 파일에 기록하고, 분석은 별도 도구에 맡깁니다. 프로그램의 함수 호출마다 기록하는 추적형 프로파일러와 달리 샘플을 모으므로 이미 실행 중인 프로세스에도 붙어 조사할 수 있습니다.

일반적인 flame graph는 샘플을 함수별로 합산해 어디에서 시간이 많이 쓰였는지 보여줍니다. 그러나 asyncio에서는 이벤트 루프가 여러 작업을 번갈아 실행하고, 작업은 await에서 멈춰 다른 작업에 실행을 넘깁니다. 함수가 프로파일 전체 시간의 30%를 차지해도 한 작업이 오래 걸린 결과인지, 많은 작업이 짧게 그 함수를 거친 결과인지 함수별 합계만으로는 알기 어렵습니다.

작업이 실행했는지 기다렸는지

Austin 4.1은 CPython 3.14 이상에서 이벤트 루프의 작업 그래프를 추적합니다. 각 작업이 실행하거나 중단된 코루틴 스택과 어느 작업이 다른 작업을 기다리는지 기록합니다. 실행 중인 스레드에서 얻은 샘플은 당시 실행하던 작업에 연결하고, 멈춰 있는 작업의 스택도 await 관계와 함께 보존합니다.

이 작업 정보는 CPython 3.14에서 외부 도구가 실행 중인 인터프리터를 살펴볼 수 있도록 지원한 원격 디버깅 기능과 맞물립니다. Austin은 프로파일링 대상에 코드를 심지 않고 자료를 수집하며, 기본 모드에서는 샘플링 중 대상 스레드를 멈추지 않습니다. 실행 중인 프로세스에 붙이는 방식은 Linux와 macOS에서 높은 권한이 필요합니다.

Austin의 VS Code 확장 프로그램은 수집한 프로파일을 Task Trace 패널에 표시합니다. 패널은 이벤트 루프별로 작업을 시간순으로 배치하고, 기다림을 일으킨 작업 아래에 대기 작업을 중첩해 실행 시간과 대기 시간을 나눠 보여줍니다. 합산 flame graph가 함수별 시간 분포를 나타낸다면 Task Trace는 요청에 참여한 작업들이 언제 실행되고 무엇을 기다렸는지 보여줍니다.

CPython 3.15에 포함된 Tachyon도 asyncio 스택에 작업 이름을 붙입니다. Tornetta의 설명에 따르면 Tachyon은 작업 이름을 표시한 뒤에도 샘플을 하나의 프로파일로 합산합니다. Austin은 샘플과 작업의 연결을 유지하고 작업별 흐름을 따라가는 점에서 차이가 있습니다.

Austin 4.1은 CPython 3.10부터 3.15까지와 free-threaded 빌드를 지원하지만, 작업 그래프를 추적하는 asyncio 기능은 CPython 3.14 이상에서 작동합니다. 따라서 더 낮은 버전에서도 Austin으로 일반적인 샘플링 프로파일을 만들 수 있지만, 작업별 실행·대기 타임라인은 3.14 이상 환경에서 이용합니다.

자료: The Hub of Heliopolis / 정리·해설: Trawling

참고 자료