概要
jemalloc は2004年に構想され、20年間にわたり公開利用されたメモリアロケータ。 開発フェーズ ごとに成功と課題を経験し、主にFreeBSD、Firefox、Facebook/Metaで進化。 オープンソース として公開は継続するが、上流開発は終了。 外部との連携やニーズ把握の難しさ、技術的負債が課題として浮上。 今後はフォークや新たな開発者による進展に期待。
jemallocの開発フェーズと回顧
-
Phase 0: Lyken
- 2004年、科学計算向け言語Lykenの開発とともに 手動メモリアロケータ を実装
- 2005年5月、機能的に完成
- ガーベジコレクタは未完成
- 2005年9月、 FreeBSD への統合を開始
- Lykenからアロケータを削除し、システムアロケータの薄いラッパーに移行
- Lykenで必要だった 統計機能 は後年jemallocに実装
-
Phase 1: FreeBSD
- 2005年、マルチプロセッサ化の進展を背景に phkmalloc からの置換を目指す
- 初期統合後、 断片化問題 が顕在化(特にKDEアプリで深刻)
- 原因は サイズクラス分離 の欠如による統一的な割り当て方式
- 研究と実験を経て、 サイズ分離型レイアウト に全面刷新(2006年BSDCan論文で解説)
-
Phase 1.5: Firefox
- 2007年、 Mozilla Firefox 3 のリリース前、断片化問題が深刻化
- Linux移植は容易だったが、 Windows対応 は困難
- FreeBSD libcにあったjemallocを フォーク し、移植性向上
- 実装が単一ファイルで管理しやすかったが、 複雑化 が進行
- Firefox開発者が上流に貢献するも、 フォーク版の方が高性能 という結果に
- 最適化の行き過ぎか、性能退化かは不明
-
Phase 2: Facebook
- 2009年、Facebookでの 導入障壁は計測機能の不足
- tcmallocやpprof によるヒーププロファイリングが必須
- jemalloc 1.0.0で pprof互換ヒーププロファイリング を実装
- GitHubへ移行し、外部貢献も増加
- 3.0.0で テスト基盤とValgrind対応、4.xで データ削除の最適化とJSONテレメトリ、5.xで extents化 や 巨大ページ対応
- 5.0.0で Valgrind対応を削除、Facebook内で不要と判断
- Rust開発者などから反発、 Rustバイナリからの除外 が加速
- Facebookの 大規模テレメトリ が性能改善に大きく寄与
- 継続的インテグレーションや包括的テレメトリも整備
- 2017年以降、Qi Wangらが開発・保守を継続
- Metaへの社名変更以降、 コア技術への投資減少、HPA(Huge Page Allocation)の停滞
-
Phase 4: Stasis(停滞期)
- 上流開発の終了 を宣言
- Metaと外部のニーズ乖離、Meta独自方針へ
- 技術的負債の返済には膨大なリファクタリングが必要
- devブランチや5.3.0リリースからの フォーク に期待
- Valgrind対応削除 など、外部利用者への認識不足が問題に
- Androidでの利用や置換にも当初気付かず
- 他組織からの 主要貢献者確保に失敗
- CMake対応なども未完
- オープンな開発体制 だけでは独立プロジェクトとしての発展は困難
jemallocの総括と今後
- ガーベジコレクション 推進派でありながら、手動メモリアロケータ開発に大きな満足感
- 協力者・利用者・支援者 への感謝
- 今後は 新たな開発者やフォーク による発展に期待
- オープンソースとしての公開 は今後も継続
開発フェーズ別の成功・失敗まとめ
-
成功例
- FreeBSDやFacebookなど大規模基盤での採用
- 高性能・低断片化・豊富なテレメトリ
- 外部貢献による機能拡張
-
失敗例
- 断片化問題やValgrind対応削除による反発
- 外部利用者や他プロジェクトのニーズ把握不足
- 他組織との主要貢献者ネットワーク形成に失敗
- 技術的負債の蓄積と停滞
今後の展望
- 既存の5.3.0リリースやdevブランチ からのフォークによる新展開
- 他組織やコミュニティ主導での 独自発展
- メモリアロケータ分野 での新たな挑戦と進化