Trifecta Tech Foundation이 Rust로 구현한 zstd 프로젝트인 libzstd-rs-sys의 첫 번째 릴리스를 발표합니다. 이식성, 드롭인 대체 가능성, 오픈 소스 생태계 강화, 현재 진행 상황과 향후 계획을 소개합니다.
지난 1년 동안 저희는 세 번째 압축 프로젝트를 조용히 진행해 왔습니다. zlib와 bzip2에 이어 이제 libzstd-rs-sys로 zstd에 도전하고 있으며, 그 첫 번째 릴리스를 자랑스럽게 발표합니다.
Zstd는 현대적인 CPU를 염두에 두고 설계된 압축 형식입니다. gzip보다 훨씬 빠르면서도 더 높은 압축률을 제공합니다. 이미 널리 사용되고 있으며, 웹 트래픽에서 점진적으로 gzip을 대체하게 될 것으로 기대합니다.
Rust에서 zstd를 사용하는 것은 이미 zstd 크레이트를 통해 지원되는데, 왜 굳이 완전히 새로운 구현을 만들까요?
Rust의 실용적인 장점 하나는 이식성 있는 소프트웨어를 작성하기 쉽다는 점입니다. 현재 zstd 크레이트는 소스에서 C 코드를 컴파일하는데, 이를 위해서는 대상 플랫폼용 C 툴체인이 필요하고 대상 플랫폼이 지원되어야만 합니다. Windows나 webassembly용 C 툴체인을 설정하는 일은 까다로울 수 있으며, 순수 Rust 구현이라면 이런 과정이 필요하지 않습니다. Rust 프로그래머에게 Rust로 작성된 의존성을 사용하는 것은 더 나은 경험입니다.
또한 zlib와 bzip2와 마찬가지로, 저희는 libzstd-rs-sys를 드롭인 호환 C 라이브러리로 컴파일하는 것도 지원합니다. 따라서 저희는 C 레퍼런스 구현의 대안이거나, 그렇게 되는 것을 목표로 하고 있습니다.
C 레퍼런스 구현은 Meta가 유지 관리하고 있으며, 기여하려면 그들과 기여자 계약에 서명해야 합니다. 저희는 독립적이면서 성능이 뛰어나고 호환 가능한 구현이 오픈 소스 생태계를 더 강하게 만든다고 믿습니다.
레퍼런스 구현은 처음에 c2rust를 사용해 변환되었고, 이후 저희는 압축 해제와 사전 빌더에 대한 정리 작업을 완료했습니다.
저희는 Rust 코드(C 정적 라이브러리로 컴파일됨)를 레퍼런스 구현의 테스트 스위트로 테스트합니다. 여기에 더해 퍼즈 테스트와 Miri도 사용하고 있으므로, 구현의 정확성에 대해 확신하고 있습니다.
사전 릴리스는 여기에서 확인할 수 있습니다: github.com/trifectatechfoundation/libzstd-rs-sys/releases/tag/v0.0.1-prerelease.2.
이 작업은 생태계에도 이점을 가져왔습니다. 저희는 Miri의 몇 가지 한계를 발견했고(현재는 해결됨), Clippy에도 기여했습니다. 최근 기여에 대한 더 완전한 정리는 여기에서 확인할 수 있습니다.
기본적으로 저희 구현의 압축 해제 성능은 C 레퍼런스 구현보다 몇 퍼센트 정도 느립니다. 저희는 benchmark suite에서 main에 병합되는 각 변경을 벤치마크합니다.
하지만 unsafe-performance-experimental 기능 플래그를 활성화하면 C 성능과 동일해지므로, 저희는 이 성능 저하를 정당화할 수 있다고 믿습니다. 이 기능 플래그는 입력의 데이터를 사용해 데이터 구조를 인덱싱하는 4개의 경계 검사(bounds checks)를 비활성화합니다. 대부분의 사용자에게는 약 3%의 성능 저하가 향상된 메모리 안전성을 위해 지불할 만한 수용 가능한 대가일 것입니다. 정말로 마지막 약간의 성능이 필요하다면, 본인 책임하에 이 플래그를 활성화할 수 있습니다. 이 네 위치에서의 동작은 경계를 검사하지 않는 C와 동일하며, 실제로 많은 프로덕션 시스템에서 문제 없이 잘 실행되는 것으로 보입니다.
저희는 이 라이브러리의 압축 부분에 대한 자금을 찾고 있습니다.
압축과 압축 해제 사이의 코드 공유 때문에 압축 코드도 조금 살펴보았지만, 대부분의 정리 작업은 아직 남아 있습니다. 압축 성능이 예상치 않게 저하되지 않도록 벤치마크를 설정해 두었고, 앞서 언급했듯이 올바른 결과를 생성하는지 확인하기 위해 이미 레퍼런스 구현의 테스트 스위트도 사용하고 있습니다.
남은 작업은 Milestone 4: Encoder implementation에 정리되어 있습니다. 저희 작업을 지원하고 싶으시다면 연락해 주세요. trifectatech.org/support를 참고해 주세요.
저희는 C 라이브러리 대신 libzstd-rs-sys를 사용하는 자체 zstd 포크를 가지고 있습니다. 언젠가는 이를 업스트림에 반영하고 싶습니다.
가장 일반적으로 사용되는 API에 대해서는 이는 간단합니다. 하지만 experimental 기능의 경우 zstd-safe는 enum을 사용하지만, 저희는 FFI 안전성을 위해 struct를 사용해야 해서 몇 가지 불일치가 발생합니다.
압축 해제 측 작업은 Chainguard, Astral, NLnet Foundation의 자금 지원을 받았으며, 저희는 그들의 지원에 감사드립니다! Sovereign Tech Agency는 사전 빌더에 투자해 주었습니다. 감사합니다!
Trifecta Tech Foundation은 중요한 인프라 소프트웨어를 위한 오픈 소스 구성 요소를 만드는 비영리 단체이자 공익 기관(Public Benefit Organisation, 501(c)(3)와 동등)입니다. 데이터 압축, 시간 동기화, 권한 경계에 대한 저희의 이니셔티브는 수백만 명의 디지털 보안에 영향을 미칩니다. 저희 작업을 지원하고 싶으시다면 연락해 주세요. trifectatech.org/support를 참고해 주세요.
Astral은 Python 생태계를 위한 고성능 개발자 도구를 만듭니다.
Astral의 사명은 Python 생태계를 더 생산적으로 만드는 것입니다. 자세한 내용은 astral.sh에서 확인하세요.
NLnet Foundation은 공인된 자선 비영리 재단입니다. 이 재단은 인터넷 기술 분야의 네트워크 연구와 개발을 촉진합니다. NLnet Foundation의 정관에는 다음과 같이 명시되어 있습니다. "전자 정보의 교환과 그 목적에 관련되거나 그 목적에 유익한 모든 것을 촉진한다." NLnet이 선호하는 수단은 독립적인 연구자와 개발자를 지원하는 작고 독립적인 프로젝트에 소액 보조금을 수여하는 것입니다. 자세한 내용은 nlnet.nl에서 확인하세요.
Chainguard는 기본적으로 안전한 스택을 위한 신뢰할 수 있는 오픈 소스 소프트웨어를 구축합니다. 자세한 내용은 chainguard.dev에서 확인하세요.
문의는 Erik Jonkers에게 부탁드립니다: contact@trifectatech.org