バッファを4倍にしたらmimallocに追いついた話
TL;DR
自作アロケータ hz3 の内部リングバッファを 256→1024 に増やしたら、マルチスレッド性能が +16〜46% 改善して mimalloc
と互角になった。
背景
hz3 は hakozuna
プロジェクトで開発中の実験的メモリアロケータ。マルチスレッド環境で「他スレッドが確保したメモリを解放する」(remote
free) パターンの最適化に注力している。
ある日、T=32 スレッド / remote=90% という極端なベンチマークで mimalloc に負けていることに気づいた。
原因調査
統計フラグを有効にしてプロファイルを取ると:
overflow_sent=943435
remote free を一時的に溜める「リングバッファ」が溢れまくっていた。
溢れると何が起きるか:
- バッチ処理ではなく1件ずつ処理に切り替わる
- CAS (Compare-And-Swap) の回数が増える
- キャッシュ効率が落ちる
解決策
// 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