실시간 C/C++/Rust 빌드 시각화 도구를 만들었음

8 hours ago 2

  • What the Fork은 실시간으로 C/C++/Rust 등 다양한 빌드 과정을 시각화하는 크로스플랫폼 도구임
  • 기존 빌드 시스템의 병렬 처리 부족, 비효율적 프로세스 등 구조적 문제를 쉽게 파악할 수 있음
  • 모든 빌드 시스템 및 프로그래밍 언어에서 동작하며, make, ninja, gradle, zig, cargo 등 다양한 빌드 툴 지원 가능함
  • 시스템 호출 모니터링을 통해 각 프로세스의 실행 시간, 명령어, 종속 관계를 박스 형태로 시각화함
  • 빌드 최적화, 병목 현상 분석, CI 성능 개선 등에 매우 유용한 도구임

소개 및 배경

  • What the Fork은 빌드가 느려지는 원인을 시각적으로 진단하기 위해 개발된 실시간 빌드 시각화 도구임
  • LLVM 프로젝트처럼 코드량 자체가 많아서 컴파일 속도가 느릴 수 있으나, 대부분의 빌드는 비효율적인 설정 탓에 불필요하게 오래 걸리는 경우가 많음
  • 기존에는 빌드의 문제점을 직접 확인하거나 구조적 문제를 한눈에 보기 어려웠기 때문에 이런 도구가 필요했음
  • 이 도구는 크로스플랫폼으로 설계되었고, 모든 빌드 시스템과 언어에 적용 가능함

주요 기능 및 사용법

  • What the Fork은 단순한 시스템 프로파일러가 아닌, 빌드 특화 문제를 진단하는 도구임
  • 예시로는 make 사용 시 -j 플래그 미사용, 특정 파일 혹은 컴파일 단계에서의 시간 쏠림, 병렬 처리가 가능한데도 순차적으로 실행되는 명령어 탐지 등이 있음
  • 특히 CI 환경의 clean build 성능 분석 및 최적화에 효과적임
  • 사용 방법은 wtf 명령어를 빌드 명령 앞에 붙여 실행 (예: wtf make, wtf cargo build, wtf npm run build 등)
  • 빌드가 시작되면 UI가 실행되어 각 프로세스의 진행 상황을 실시간으로 갱신함

UI 및 시각화 방식

  • 각 빌드 프로세스는 박스 형태로 타임라인 상에 표시되며, 색상으로 유형 구분
  • 프로세스의 부모-자식 관계는 중첩 구조로 표현
  • 하단 패널에서는 선택된 프로세스의 실행 시간, 작업 디렉토리, 전체 명령어 인자 정보를 표시

작동 원리

  • 빌드는 여러 프로세스(예: bash, clang, ld)의 조합임
  • 대규모 빌드는 cargo, make, bazel, gradle, xcodebuild 등 다양한 빌드 도구를 사용하며, 이들은 실제로 많은 명령어와 종속성, 캐시, 스케줄링 작업을 수행함
  • 터미널 출력만으로는 중첩된 프로세스(예: clang이 내부적으로 호출하는 ld 등)와 세부 타이밍 구조를 파악 불가
  • 이를 위해 OS별 프로세스 시작, 종료를 감지하는 시스템 호출(macOS: Endpoint Security API, Linux: ptrace(), Windows: Event Tracing for Windows 등)을 활용함
  • 이런 방식으로 빌드 전 과정 및 타임라인 복원, 각 단계의 실행 경로와 시간 식별 가능함
  • 빌드 외에도 다양한 서브프로세스 트래킹에 활용할 수 있음

실제 사례 및 관찰 결과

  • 여러 엔지니어(Delta, Mozilla, Apple 소속)가 실제로 프로젝트에 적용 후 예상치 못한 이슈를 발견함
  • 예시 1: Cargo를 사용하는 오픈소스 프로젝트에서 파일들이 순차적으로 컴파일되어 병렬성 부족 확인 (10코어 CPU에서 10배 이상 속도 개선 가능성 확인)
  • 예시 2: Ninja를 활용한 LLVM 빌드에서는 모든 CPU 코어가 효율적으로 병렬 작업을 수행, 이상적인 빌드 효율 달성
  • 예시 3: CMake 기반 프로젝트에서 cmake/make/clang의 중첩 실행 및 Xcode/OS 버전 재확인이 85회 반복되는 비효율적 구조 발견(실제 작업은 극히 일부)
  • 예시 4: xcodebuild를 이용한 대형 Objective-C 프로젝트에서 빌드 후반부 병렬 처리 부족 및 빌드 시작 전 6초간 비활성 상태 존재(비교적 ninja는 0.4초 후 바로 컴파일 시작)
  • 예시 5: Zig가 Orca Project를 컴파일할 때 종속성 빌드 순서가 무작위로 정해져, 운에 따라 병렬 처리 효율이 바뀜. 일부 종속성이 마지막에 실행되어 병렬성 저하되는 현상 관찰
  • 예시 6: make/go를 활용한 GitHub CLI 프로젝트에서 종속성 다운로드 시간이 큼. 종속성 축소 시 빌드 속도 개선 기대

활용 효과 및 한계

  • 시각적 타임라인 분석을 통해 예상치 못한 병목 구간, 불필요한 의존성 반복, 병렬성이 부족한 영역 확인 가능
  • 종속성 문제, 불필요한 재작업, 특정 툴의 비효율 등 구조적 개선점을 빠르게 파악하여 빌드 성능 최적화에 직접적 활용 가능
  • 프로세스의 전체 명령어 확인으로 더 세밀한 분석 가능

베타 프로그램

  • What the Fork은 Windows, Linux, macOS에서 동작
  • 피드백을 원하는 개인 및 팀은 프라이빗 베타 신청 가능 (구글 폼 링크 제공)

Read Entire Article