bzip2 Crate가 C에서 100% Rust로 전환됨

2 days ago 1

  • bzip2 크레이트가 C 코드 의존성을 100% Rust 구현으로 대체함
  • 성능이 기존보다 전반적으로 향상되고, 크로스 컴파일이 더 쉬워짐
  • Rust 구현은 C 버전 대비 데이터 압축 및 해제 속도 모두 개선됨
  • 심볼 충돌 문제와 같은 라이브러리 의존성 이슈가 크게 줄어듦
  • 보안 감사를 거쳐 중요한 로직 버그를 수정, 안정성이 검증됨

bzip2 크레이트 0.6.0 출시 및 Rust 기반 전환

  • 오늘 bzip2 버전 0.6.0이 배포되었음
  • 이제 기본적으로 자체 개발한 rust 기반 bzip2 알고리듬 구현체인 libbz2-rs-sys을 사용함
  • 이 전환을 통해 bzip2 크레이트는 더욱 빨라지고, 크로스 컴파일이 쉬워졌음
  • libbz2-rs-sys 크레이트는 C 동적 라이브러리 형태로도 빌드 가능함. 이를 통해 C 프로젝트에서도 성능 개선을 활용할 수 있음

왜 이런 전환이 이루어졌는가?

  • bzip2 알고리듬은 90년대에 만들어져 지금은 널리 쓰이지는 않지만, 여러 프로토콜과 라이브러리에서 여전히 규격 준수를 위해 필요함
  • 많은 프로젝트가 직접적으로는 아니지만 의존성 트리 어느 깊은 곳에서 bzip2에 의존하고 있음
  • 우리는 zlib-rs에서 쌓은 경험을 바탕으로 이번에 bzip2 구현을 현대화했음
  • libbz2-rs-sys 구현 세부 내용은 이전 블로그 포스트에서 다룸. 여기서는 이번 전환의 이점을 살펴봄

향상된 성능

  • rust 구현체는 전반적으로 C 버전보다 더 높은 성능을 보임
  • 일부 상황에서는 동등한 성능이지만, 느린 경우는 없음
  • 압축 성능: bzip2에서는 level 옵션이 있지만 성능 영향은 미미함
  • 테스트 결과, 대표적인 샘플 파일에서 rust 버전이 10% 이상 속도 향상됨

압축:

파일 C(수행 사이클) Rust(수행 사이클) 상대적 변화
sample3.ref (level 1) 38.51M 33.53M -14.87%
silesia-small.tar (level 1) 3.43G 3.00G -14.30%
silesia-small.tar (level 9) 3.47G 3.17G -9.66%

압축 해제에서도 모든 경우에서 개선된 성능을 보여줌:

파일 C(수행 사이클) Rust(수행 사이클) 상대적 변화
sample3.bz2 2.53M 2.42M -4.48%
sample1.bz2 9.63M 8.86M -8.63%
sample2.bz2 20.47M 19.02M -7.67%
dancing-color.ps.bz2 87.46M 83.16M -5.17%
re2-exhaustive.txt.bz2 1.89G 1.76G -7.65%
zip64support.tar.bz2 2.32G 2.11G -10.00%

단, macOS 환경에서는 간혹 압축 해제 수치 변화가 발생함. 성능 측정 도구의 한계로 분석이 어려웠음

크로스 컴파일 지원

  • C 의존성이 있는 Rust 프로젝트의 크로스 컴파일은 보통 cc 크레이트 덕분에 잘 동작하지만, 실패 시 디버깅이 매우 어려움
  • 시스템 라이브러리 링크 과정에서 예기치 않은 문제가 발생하기 쉽고, WebAssembly 빌드를 비롯한 일부 환경에서는 실질적 장애 요소가 됨
  • rust 구현으로 전환함으로써 C 관련 문제들이 완전히 사라짐
  • 이제 윈도우, 안드로이드, 웹어셈블리 등에서도 특이사항 없이 크로스 컴파일이 가능함
  • 이는 사용자 경험뿐 아니라 유지보수 관점에서도 큰 장점임

기본적으로 심볼(export) 충돌 없음

  • C 의존성의 경우 Rust 외부 블록에서 심볼을 export해야 하기 때문에, 다른 의존성이 동일한 심볼을 export할 시 충돌이 발생함
  • libbz2-rs-sys는 기본적으로 심볼을 export하지 않도록 설계
  • 따라서 다른 외부 라이브러리와 심볼 충돌이 발생할 일이 없음. 필요하다면 feature flag로 export를 활성화할 수도 있음

MIRI 기반 테스트 실행

  • Rust에서 bzip2를 성능 높게 구현하려면 unsafe 코드 사용이 불가피하고, C 인터페이스 복제에도 unsafe 코드가 다수 필요함
  • 다행히 이 코드를 MIRI 환경에서 실행 및 테스트할 수 있음
  • 더 나아가, bzip2를 사용하는 상위 레벨 라이브러리나 애플리케이션도 이제는 MIRI 테스트가 가능해짐

결론

이제 bzip2 크레이트는 더 빨라졌음. 더 이상 신경 쓰지 않아도 될 정도로, 자연스럽게 더 나은 경험을 제공함

Read Entire Article