👌

バッファを4倍にしたらmimallocに追いついた話

に公開

TL;DR

https://github.com/hakorune/hakozuna

自作アロケータ hz3 の内部リングバッファを 256→1024 に増やしたら、マルチスレッド性能が +16〜46% 改善して mimalloc
と互角になった。

背景

hz3 は hakozuna
プロジェクトで開発中の実験的メモリアロケータ。マルチスレッド環境で「他スレッドが確保したメモリを解放する」(remote
free) パターンの最適化に注力している。

ある日、T=32 スレッド / remote=90% という極端なベンチマークで mimalloc に負けていることに気づいた。

原因調査

統計フラグを有効にしてプロファイルを取ると:

overflow_sent=943435

remote free を一時的に溜める「リングバッファ」が溢れまくっていた。

溢れると何が起きるか:

  1. バッチ処理ではなく1件ずつ処理に切り替わる
  2. CAS (Compare-And-Swap) の回数が増える
  3. キャッシュ効率が落ちる

解決策

// Before
#define HZ3_REMOTE_STASH_RING_SIZE 256

// After
#define HZ3_REMOTE_STASH_RING_SIZE 1024

これだけ。

結果
┌───────────┬──────┬──────────┬───────┐
│ 条件 │ hz3 │ mimalloc │ 差 │
├───────────┼──────┼──────────┼───────┤
│ T=8 R=90 │ 193M │ 132M │ +46% │
├───────────┼──────┼──────────┼───────┤
│ T=16 R=50 │ 271M │ 209M │ +30% │
├───────────┼──────┼──────────┼───────┤
│ T=32 R=90 │ 199M │ 196M │ +1.2% │
└───────────┴──────┴──────────┴───────┘
T=32 R=90 で mimalloc と互角。T=8/T=16 では大差で勝利。

overflow も 943K → 131K (-86%) に減少。

代償

  • TLS メモリ: +12KB/スレッド (16B × 768エントリ増)
  • 32スレッドで +384KB

Discussion