bzip2crate 0.6.0은 bzip2 알고리듬의 Rust 구현인libbz2-rs-sys를 기본값으로 채택해 C 의존을 제거하고, 속도와 교차 컴파일 편의성을 함께 개선함- bzip2는 사용 빈도가 줄어든 오래된 알고리듬이지만, 여러 프로토콜과 라이브러리가 명세 준수를 위해 여전히 지원해야 해 의존성 트리 깊은 곳에 남아 있음
- Rust 구현은 압축에서 C 대비 약 9.66~14.87% 적은 CPU 사이클을 사용했고, 압축 해제에서도 테스트 전반에서 4.48~10.00% 개선됨
- C 제거로 WebAssembly, Windows, Android 빌드가 단순해지고, 기본적으로
libbz2-rs-sys심볼을 내보내지 않아 다른 의존성과의 심볼 충돌 위험도 줄어듦 - 감사에서는 off-by-one 논리 버그 1건과 퍼저 제한 일부가 수정됐으며,
bzip2를 쓰는 상위 라이브러리와 애플리케이션도 MIRI 실행이 가능해짐
bzip2 0.6.0의 기본 구현 변경
bzip2crate 0.6.0은 bzip2 알고리듬의 Rust 구현인libbz2-rs-sys를 기본으로 사용함- 기존 C 의존을 제거하면서
bzip2crate는 더 빠르고 교차 컴파일하기 쉬워짐 libbz2-rs-syscrate는 C 프로젝트에서도 개선 효과를 활용할 수 있도록 C 동적 라이브러리로 빌드 가능함- bzip2는 오늘날 사용량이 많지 않지만, 많은 프로토콜과 라이브러리가 명세 준수를 위해 여전히 지원해야 하며 여러 프로젝트의 의존성 트리 깊은 곳에 남아 있음
- 구현 세부사항은 이전 글 Translating bzip2 with c2rust에서 확인할 수 있음
성능 개선 결과
- Rust 구현은 일반적으로 C 구현보다 빠르며, 일부 경우에는 C 성능과 비슷한 수준임
- 알려진 범위에서 실질적으로 더 느린 사례는 없음
- 압축 벤치마크에서는 C 대비 CPU 사이클이 줄어듦
sample3.reflevel 1:38.51M→33.53M, -14.87%silesia-small.tarlevel 1:3.43G→3.00G, -14.30%silesia-small.tarlevel 9:3.47G→3.17G, -9.66%- bzip2의
level은 작업 메모리 사용량을 뜻하며 성능에는 큰 영향을 주지 않음 sample3.ref는 level 1만으로도 파일 크기보다 많은 메모리를 할당하므로 더 높은 level은 관련성이 낮음
- 압축 해제 성능도 테스트 전반에서 개선됨
sample3.bz2: -4.48%sample1.bz2: -8.63%sample2.bz2: -7.67%dancing-color.ps.bz2: -5.17%re2-exhaustive.txt.bz2: -7.65%zip64support.tar.bz2: -10.00%
- macOS 벤치마크 머신에서는 압축 해제 성능 수치가 가끔 낮게 나오는 경우가 있음
- 원인은 확인되지 않았고, macOS에서는
perf처럼 성능 추적을 자동화할 수 있는 도구를 작동시키기 어려웠음
- 원인은 확인되지 않았고, macOS에서는
빌드와 심볼 충돌 완화
- C 의존성이 있는 Rust 프로젝트의 교차 컴파일은
cccrate 덕분에 바로 동작하는 경우가 많지만, 실패하면 오류 디버깅이 어려울 수 있음- 시스템 라이브러리 링크도 혼란스럽고 재현하기 어려운 문제를 만들 수 있음
- bzip2의 WebAssembly 컴파일은 오래전부터 문제가 있었음
- C 의존을 제거하고 Rust 코드만 사용하면서 WebAssembly, Windows, Android 빌드가 동작하기 쉬워짐
libbz2-rs-sys는 기본적으로 심볼을 export하지 않음- C 의존성을 사용하면 Rust
extern블록이 찾을 수 있도록 심볼을 export해야 함 - export된 이름은 다른 의존성이 같은 심볼을 선언할 때 충돌할 수 있음
- Rust 프로젝트가 심볼 export를 필요로 하면 기능 플래그로 활성화할 수 있음
- C 의존성을 사용하면 Rust
검증과 감사 결과
- 성능을 내는 bzip2 구현에는 일부 unsafe 코드가 필요하고, C 인터페이스를 Rust로 복제하려면 더 많은 unsafe 코드가 들어감
- 해당 코드는 MIRI에서 실행 가능함
bzip2를 사용하는 고수준 라이브러리나 애플리케이션도 이제 MIRI로 실행할 수 있음
- 감사에서는 off-by-one 논리 버그 1건이 발견됐고 퍼저 제한 일부가 수정됨
- 그 외 중요한 발견 사항은 없었음
- 감사는 Radically Open Security가 맡았으며, 전체 보고서는 감사 보고서 PDF에서 확인 가능함
- 이번 작업은
bzip2crate의 유지관리자인 Alex Crichton, 감사와 전문성을 제공한 Radically Open Security, e-Commons Fund를 통해 자금을 지원한 NLnet Foundation의 도움을 받음