Rust로 Zstandard 발표
1 week ago
4
- libzstd-rs-sys는 Trifecta Tech Foundation의 zlib·bzip2 이후 세 번째 압축 프로젝트로, zstd의 첫 Rust 기반 릴리스임
- Zstd는 현대 CPU에 맞춘 압축 형식으로 gzip보다 빠르고 압축률도 높아, 웹 트래픽에서 gzip을 점진적으로 대체할 것으로 예상됨
- 기존 Rust zstd 크레이트는 C 코드를 소스에서 컴파일하므로 C 툴체인과 대상 지원이 필요해 Windows·WebAssembly 설정이 어려울 수 있음
- Rust 구현은 드롭인 호환 C 라이브러리로 컴파일 가능하며, 테스트 스위트·퍼즈 테스트·Miri로 C 참조 구현의 대안을 검증 중임
- 기본 압축 해제는 C보다 몇 퍼센트 느리지만, 약 3% 성능 저하는 메모리 안전성 비용이며 실험 플래그로 C 성능에 맞출 수 있음
첫 릴리스와 Rust 구현의 의미
- Trifecta Tech Foundation은 zlib, bzip2에 이어 세 번째 압축 프로젝트로 zstd를 다루는 libzstd-rs-sys의 첫 릴리스를 발표함
- Zstd는 현대 CPU를 염두에 두고 설계된 압축 형식으로, gzip보다 훨씬 빠르고 더 나은 압축률을 낼 수 있음
- zstd는 이미 널리 쓰이고 있으며 웹 트래픽에서 gzip을 점진적으로 대체할 것으로 예상됨
- Rust에서는 이미 zstd 크레이트로 zstd를 사용할 수 있지만, 기존 크레이트는 C 코드를 소스에서 컴파일하므로 대상용 C 툴체인과 대상 지원이 필요함
- Windows나 WebAssembly용 C 툴체인 설정은 어려울 수 있어, 순수 Rust 구현은 Rust 개발자에게 더 나은 의존성 사용 경험을 제공함
- libzstd-rs-sys는 zlib·bzip2 작업처럼 드롭인 호환 C 라이브러리로 컴파일할 수 있으며, C 참조 구현의 대안을 목표로 함
- C 참조 구현은 Meta가 유지보수하고 기여 시 Meta와 기여자 계약을 체결해야 하므로, 독립적이고 성능이 좋으며 호환되는 구현이 오픈소스 생태계를 강화할 수 있음
검증, 성능, 남은 작업
- 초기 참조 구현은 c2rust로 변환됐고, 이후 압축 해제와 딕셔너리 빌더의 정리 작업이 완료됨
- Rust 코드는 C 정적 라이브러리로 컴파일한 뒤 참조 구현의 테스트 스위트로 검증됨
- 퍼즈 테스트와 Miri도 구현 정확성을 검증하는 데 사용됨
- 프리릴리스는 libzstd-rs-sys v0.0.1-prerelease.2에서 제공됨
-
메모리 안전성의 비용
- 기본 압축 해제 성능은 C 참조 구현보다 몇 퍼센트 느림
- main에 병합되는 각 변경은 벤치마크 스위트에서 측정됨
- unsafe-performance-experimental 기능 플래그를 켜면 C 성능과 일치함
- 이 플래그는 입력 데이터가 자료구조 인덱싱에 쓰이는 4곳의 경계 검사를 비활성화함
- 대부분의 사용자에게 약 3% 성능 저하는 향상된 메모리 안전성을 위한 수용 가능한 비용일 가능성이 큼
- 마지막 성능까지 필요하다면 위험을 감수하고 해당 플래그를 켤 수 있으며, 이 4곳의 동작은 경계 검사를 하지 않는 C와 일치함
-
압축 구현과 생태계 통합
- 압축 부분은 아직 펀딩을 찾고 있음
- 압축과 압축 해제 사이에 코드 공유가 있어 압축 코드도 일부 살펴봤지만, 대부분의 정리 작업은 남아 있음
- 압축 성능 퇴보를 막기 위한 벤치마크가 설정됐고, 참조 구현의 테스트 스위트로 올바른 결과 생성 여부를 확인 중임
- 남은 작업은 Milestone 4: Encoder implementation에 정리돼 있음
- libzstd-rs-sys를 C 라이브러리 대신 사용하는 zstd 포크가 있으며, 향후 업스트림 반영을 원함
- 가장 많이 쓰이는 API에서는 통합이 비교적 단순함
- experimental 기능에서는 zstd-safe가 enum을 쓰지만 FFI 안전성을 위해 struct를 써야 하는 불일치가 있음
-
후원
-
Homepage
-
개발자
- Rust로 Zstandard 발표