`bzip2` crate、C から 100% Rust 実装へ移行
(trifectatech.org)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 の協力を受けた
まだコメントはありません。