Firefox, zlib-rs 도입으로 압축 성능 20배 향상!

by DD
12시간 전
조회수 4

Firefox 151 버전부터 zlib-rs 라이브러리를 gzip 압축/해제에 도입하여 성능과 안전성을 높였음

2년간의 통합 과정에서 발생한 Intel Raptor Lake CPU 버그 해결이 주요 난관이었음

성능 벤치마크 결과, 특히 Linux x86_64 환경에서 기존 zlib 대비 최대 32배 빠른 속도를 보임

CPU 버그는 하드웨어적 문제로, LLVM 컴파일러의 특정 명령어 생성을 우회하는 안전한 코드(Safe Code)로 해결함

zlib-rs 통합 과정의 복잡성

커뮤니티에서는 zlib-rs를 드롭인 호환 대체재(Drop-in Compatible Replacement)로 제시했으나, 실제 통합은 알고리즘 변경으로 인한 출력 바이트 및 길이의 미세한 차이 발생으로 인해 테스트 스위트 업데이트가 필요했음을 지적함. 또한, Firefox의 심볼 접두사(Symbol Prefixing) 규칙 준수를 위한 설정 작업도 수반되었음. 이는 단순한 구성 변경으로 해결 가능했으나, 예상치 못한 난관을 야기했음.

Intel Raptor Lake CPU 버그와 해결 과정

논의의 핵심은 Intel 13/14세대 CPU(Raptor Lake)에서 발생한 하드웨어 버그로, 특정 Huffman 코딩 결과 저장 명령어논리적으로 불가능한 경계 검사 실패(Bounds Check Failure)를 유발했음. 이는 C 언어에서는 데이터 손상(Data Corruption)으로 이어질 수 있는 심각한 문제였으나, Rust의 컴파일 타임 검사 덕분에 크래시(Crash)로 발견될 수 있었음. 해당 버그는 물리적 회로 노화로 인한 클럭 스큐(Clock Skew)가 원인으로, 마이크로코드(Microcode)로는 해결 불가한 하드웨어 문제였음.

LLVM 명령어 생성을 우회하는 Rust 코드 수정

해당 CPU 버그를 해결하기 위해, LLVM 컴파일러가 생성하는 특정 메모리 쓰기 명령어(Memory Write Instruction)를 우회하는 Rust 코드 수정이 이루어졌음. 원본 코드는 `mov byte ptr [rsi + rdi + 1], ch`와 같이 직접적인 바이트 할당을 시도했으나, 하드웨어 버그로 인해 의도와 다른 바이트가 쓰이는 문제가 발생했음. 이를 해결하기 위해 `unsafe` 코드 블록을 사용하여 `write_unaligned` 메서드로 안전하게 데이터를 기록하는 방식으로 변경되었음. 이 수정은 zlib-rs에 업스트림(Upstream)되었음.

zlib-rs의 압도적인 성능 향상 벤치마크

결론적으로 zlib-rs 도입의 가장 큰 이유는 압도적인 성능 향상임. 제공된 벤치마크에 따르면, 특히 Linux x86_64 환경에서 1MB 데이터 압축 해제 시 기존 zlib 대비 최대 27배 이상 빠른 속도를 기록했음. 스트리밍 압축 해제에서도 유사한 성능 향상이 관찰되었으며, 이는 개발자들이 복잡한 버그 해결 과정을 감수할 만큼 가치 있는 결과임을 시사함.

macOS 및 aarch64 환경에서의 성능 차이

벤치마크 결과, aarch64 시스템, 특히 macOS에서는 성능 향상 폭이 상대적으로 작았음. 이는 Apple이 제공하는 최적화된 zlib 동적 라이브러리가 인라인 어셈블리(Inline Assembly)를 사용하여 성능에 민감한 부분을 처리하기 때문임. 이 차이점을 통해 개발팀은 놓쳤던 최적화 기회를 발견하고 통합을 진행 중이라고 언급함.

zlib-rs in Firefox