🌟

「箱だ!」で設計したらmimalloc超えた ― Box Theoryの実践

に公開

「箱だ!」で設計したらmimalloc超えちゃった話

はじめに

こんにちは。メモリアロケータを作ってたら、なんかmimalloc超えちゃいました。

使った設計哲学は Box Theory(箱理論)。すごくシンプルなやつです。

Box Theoryって何?

よく聞かれるので、Q&A形式で説明しますね。

Q: Box Theoryって何?
A: 箱だよ

Q: なぜ境界集約するの?
A: 箱だから!境界作ったら責務が分かれて、デバッグの線引きができて、開発が加速するんだよね

Q: なぜ可逆性が大事なの?
A: 箱だからだよ!箱なら入れ替えればいいじゃん

Q: NO-GOの判断基準は?
A: ベンチ!数字が全て

...これだけです。シンプルでしょ?

もうちょっと真面目に説明すると

Box Theoryには4つの原則があります。

1. 境界集約

ホットパス(速くしたいところ)と制御層(判断するところ)の境界を最小限に。

箱の中 = 高速処理。触らない。
箱の境界 = 制御・判断。ここだけいじる。

境界を1箇所に集約すると、「どこを変えればいいか」が明確になります。

2. 可逆性

最適化は全部フラグで切り替えられるようにしてます。

# 普通にビルド
make all_ldpreload_scale

# 新機能試したい時はフラグ追加するだけ
make all_ldpreload_scale HZ3_LDPRELOAD_DEFS_EXTRA='-DHZ3_NEW_FEATURE=1'

ダメだったら戻せばOK。箱を入れ替えるだけ。

3. 可観測性

常時ログは重いので、終了時に一発だけ統計を吐きます(SSOT方式)。

これで再現性も確保できて、「あの時のあのビルド」が追跡できます。

4. Fail-Fast

バグは箱の境界で捕まえます。箱の中まで入れない。

おかしい状態を見つけたら即終了。デバッグが楽になります。

hakozuna (hz3) の構造

で、この哲学でメモリアロケータ作ったのがこちら:

アーキテクチャ図

3つの層(箱)に分かれてます:

やること
Hot Path 最速で割り当て・解放。TLSで完結
Cache Layer バッファリング。Owner StashとかRemoteStash Ring
Central Layer スレッド間で共有するところ

各層が「箱」になってて、境界を超える時だけコストを払う設計です。

ベンチマーク結果

で、どうなったかというと:

ベンチマーク 条件 vs mimalloc
Larson T=8-16 +15% 🎉
memcached T=4 +10% 🎉
MT remote T=8 R=90% +28% 🎉
random_mixed - 同じくらい

特に「remote-free」(スレッドAで確保してスレッドBで解放)が多い状況で強いです。

なんで勝てたの?

正直、全部わかってるわけじゃないんですが...

  • Owner Stash: remote freeを一旦バッファリングしてmutex競合を避けた
  • RemoteStash Ring: TLSのサイズを92%削減
  • Full Drain Exchange: atomic exchangeで一括回収

箱で分離してたから、それぞれ独立に最適化できたのが大きいかなと。

失敗もいっぱいした(NO-GO事例)

Box Theoryのいいところは「戻せる」こと。

実は20件以上の最適化が不採用(NO-GO)になってます:

やろうとしたこと 結果 学び
SegMath最適化 NO-GO 「絶対速いでしょ」が実測で否定された
Page-Local Remote NO-GO 合成ベンチだけ速くて他が遅くなった
PGO(プロファイル最適化) NO-GO 条件変わると逆に遅くなった

ベンチで負けたら戻す。 これだけ守ってます。

hakoruneプロジェクトについて

hakozuna (hz3) は hakorune プロジェクトの一部です。

hakoruneはBox Theoryで作ってるプログラミング言語で、MIR変換後にVMでもLLVMでも動きます。

コンパイラは...まだ苦戦中です

まとめ

Q: どうやってmimalloc超えたの?
A: 箱で分けたら超えちゃった

Q: 設計の判断基準は?
A: ベンチ!

Q: うまくいかなかったら?
A: 箱を入れ替えるだけ

シンプルな哲学でも、ちゃんと結果が出るんだなーと思いました。

リンク


ちなみにこのプロジェクト、AIのClaudeと一緒に作りました。設計哲学は僕、実装はAI。これも一種の「箱」...かもしれない?

Discussion