본문으로 건너뛰기

[uv] uv, 대규모 워크스페이스 탐색 속도 1.8배 향상: 중복 파일 읽기 제거

PR 링크: astral-sh/uv#18311 상태: Merged | 변경: +1108 / -330

들어가며

Python 프로젝트의 의존성을 관리하는 강력한 도구인 uv는 빠른 속도를 자랑합니다. 하지만 대규모 워크스페이스 환경에서는 프로젝트의 루트 및 멤버 pyproject.toml 파일을 불필요하게 여러 번 읽는 비효율성이 발견되었습니다. 이는 특히 에어플로우(Airflow)와 같이 복잡하고 큰 프로젝트에서 빌드 및 탐색 시간을 크게 증가시키는 요인이었습니다. 이번 PR은 이러한 중복 파일 읽기 문제를 해결하여 uv의 워크스페이스 탐색 성능을 최대 1.8배까지 향상시키는 것을 목표로 합니다.

코드 분석: 중복 읽기 제거 및 캐싱 강화

이번 변경의 핵심은 pyproject.toml 파일의 중복 읽기를 제거하고, 관련 정보를 효율적으로 캐싱하는 데 있습니다. 주요 변경 사항은 다음과 같습니다.

1. uv-cacheuv-once-map 의존성 추가

Cargo.toml 파일에서 uv-cacheuv-once-map 크레이트가 의존성으로 추가되었습니다. 이는 캐싱 메커니즘을 강화하고, 동일한 정보를 여러 번 계산하거나 읽는 것을 방지하는 데 중요한 역할을 합니다.

Before:

- uv-auth = { workspace = true }
- uv-cache-key = { workspace = true }
- uv-configuration = { workspace = true }
- uv-distribution = { workspace = true }

After:

+ uv-auth = { workspace = true }
+ uv-cache = { workspace = true }
 uv-cache-key = { workspace = true }
 uv-configuration = { workspace = true }
 uv-distribution = { workspace = true }

uv-once-map은 특정 키에 대해 한 번만 연산을 수행하도록 보장하여, 동시성 환경에서 중복 계산을 방지하는 데 유용합니다.

2. WorkspaceCacheCache 활용 강화

uv-build-frontend, uv-distribution 등 여러 크레이트에서 WorkspaceCache와 새로 추가된 Cache를 활용하는 방식이 변경되었습니다. 특히 ProjectWorkspace::from_maybe_project_root 함수 호출 시 cache 인자가 추가되었으며, 이는 pyproject.toml 파일의 내용을 캐시에서 효율적으로 조회하도록 합니다.

예시: uv-distribution/src/metadata/build_requires.rs

Before:

let Some(project_workspace) =
    ProjectWorkspace::from_maybe_project_root(install_path, &discovery, cache).await?

After:

let Some(project_workspace) = ProjectWorkspace::from_maybe_project_root(
    install_path,
    &discovery,
    cache,
    workspace_cache,
)
.await?

이러한 변경은 pyproject.toml 파일을 읽는 횟수를 크게 줄여줍니다. 기존에는 동일한 프로젝트나 멤버에 대해 여러 번 pyproject.toml을 읽어야 했지만, 이제는 캐시를 통해 한 번만 읽거나 캐시된 값을 재사용하게 됩니다.

3. 중복 pyproject.toml 읽기 제거

PR 설명에 따르면, 이 변경의 핵심은 "같은 정보에 대해 워크스페이스 루트 및 멤버 pyproject.toml을 여러 번 읽는 것을 피하는 것"입니다. 이전에는 루트 pyproject.toml이 130번까지 읽혔다면, 이제는 캐시 키를 위한 읽기를 제외하고 단 2번만 읽게 됩니다. 각 워크스페이스 멤버에 대해서도 4번 읽던 것이 2번으로 줄어듭니다. 이는 상당한 I/O 작업 감소로 이어집니다.

이미지 분석:

제공된 이미지(BeforeAfter)는 uv의 내부 스팬(span)을 보여줍니다. Before 이미지에서는 pyproject.toml을 읽는 작업이 여러 번 반복되는 것을 볼 수 있습니다. 반면 After 이미지에서는 이러한 반복이 현저히 줄어들고, Cache 관련 작업이 더 빈번하게 나타나는 것을 확인할 수 있습니다. 이는 캐싱이 효과적으로 작동하고 있음을 시사합니다.

4. Arc 및 동시성 처리 개선

리뷰 댓글에서 Arc 사용 및 동시성 관련 논의가 있었습니다. 특히 WorkspaceCache 내에서 Arc를 사용하고, debug_assertions가 꺼져 있을 때 발생할 수 있는 잠재적인 경쟁 상태(race condition)에 대한 우려가 제기되었습니다. 이번 PR에서는 Arc::try_unwrapArc::unwrap_or_clone과 같은 메서드를 사용하여 Arc의 소유권을 명확히 하거나 복제하는 방식을 개선했습니다. 또한, register_or_wait와 같은 함수에서 발생할 수 있는 잠재적 패닉(`

참고 자료

⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.

댓글

관련 포스트

PR Analysis 의 다른글