Add v4 C7/C6 fast classify and small-segment v4 scaffolding
This commit is contained in:
52
docs/analysis/PF_STATUS_V4_202502.md
Normal file
52
docs/analysis/PF_STATUS_V4_202502.md
Normal file
@ -0,0 +1,52 @@
|
||||
# PF/OS ベースライン (PF2, small-object v4 状態)
|
||||
|
||||
- コマンド (Release, v4: C7+C6 を v4 に強制、v3 OFF):
|
||||
```
|
||||
HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE \
|
||||
HAKMEM_BENCH_MIN_SIZE=16 \
|
||||
HAKMEM_BENCH_MAX_SIZE=1024 \
|
||||
HAKMEM_SS_OS_STATS=1 \
|
||||
HAKMEM_SMALL_HEAP_V4_ENABLED=1 \
|
||||
HAKMEM_SMALL_HEAP_V4_CLASSES=0xC0 \
|
||||
HAKMEM_SMALL_HEAP_V3_ENABLED=0 \
|
||||
perf stat -e cycles,instructions,task-clock,page-faults \
|
||||
./bench_random_mixed_hakmem 1000000 400 1
|
||||
```
|
||||
- 結果 (環境: リリースビルド, ws=400, iters=1M):
|
||||
- Throughput: **31,779,973 ops/s** (time=0.031s)
|
||||
- perf stat: cycles=205,322,023 / instructions=385,092,104 / task-clock=51.40ms / page-faults=6,702
|
||||
- `[SS_OS_STATS]` : alloc=2 free=4 madvise=2 madvise_enomem=0 madvise_disabled=0 mmap_total=2
|
||||
- 所感:
|
||||
- v4 (C7+C6) 強制時の pf/OS 基準値。v3 基準 (~40M) より遅めだが、pf 数値と OS stats を PF2 の起点として固定。
|
||||
- 今後 SmallSegmentBox_v4 を繋ぐ A/B では、page-faults/SS_OS_STATS をこの値からどこまで下げられるかを指標にする。
|
||||
|
||||
## DEBUG perf (cycles:u, -O0/-g, v4=C7+C6)
|
||||
|
||||
- ビルド:
|
||||
```
|
||||
make clean
|
||||
CFLAGS='-O0 -g' USE_LTO=0 OPT_LEVEL=0 NATIVE=0 make bench_random_mixed_hakmem -j4
|
||||
```
|
||||
- コマンド:
|
||||
```
|
||||
HAKMEM_PROFILE=DEBUG_TINY_FRONT_PERF \
|
||||
HAKMEM_BENCH_MIN_SIZE=16 \
|
||||
HAKMEM_BENCH_MAX_SIZE=1024 \
|
||||
HAKMEM_SMALL_HEAP_V4_ENABLED=1 \
|
||||
HAKMEM_SMALL_HEAP_V4_CLASSES=0xC0 \
|
||||
HAKMEM_SMALL_HEAP_V3_ENABLED=0 \
|
||||
perf record -F 5000 --call-graph dwarf -e cycles:u \
|
||||
-o perf.data.pf_v4 ./bench_random_mixed_hakmem 1000000 400 1
|
||||
```
|
||||
- Throughput: **15,173,790 ops/s** (DEBUG, ws=400, iters=1M, v4=C7+C6)
|
||||
- self% 上位 (perf report --stdio):
|
||||
- free 14.37%(small_heap_free_fast_v4 内 3.39%)
|
||||
- tiny_alloc_gate_fast 13.33%
|
||||
- main 12.93%
|
||||
- malloc 7.09%
|
||||
- ss_map_lookup 4.97% / hak_super_registry_init + memset 合算 ~4.5%
|
||||
- small_heap_alloc_fast_v4 2.23%
|
||||
- hak_tiny_size_to_class 2.21% / tiny_route_get 2.34% / front_gate_unified_enabled 2.36% / tiny_route_is_heap_kind 2.09%
|
||||
- xorshift32 2.08%
|
||||
- メモ:
|
||||
- v4 強制下でも gate/classify/ss_map_lookup が依然目立つ。Segment/OS 側が整えば pf と合わせて自明に下がるかを PF3 で確認。
|
||||
30
docs/analysis/SMALLOBJECT_SEGMENT_V4_DESIGN.md
Normal file
30
docs/analysis/SMALLOBJECT_SEGMENT_V4_DESIGN.md
Normal file
@ -0,0 +1,30 @@
|
||||
# SmallObject Segment v4 設計メモ (PF2 草稿)
|
||||
|
||||
## 目的と背景
|
||||
- Mixed 16–1024B で mimalloc の 70〜80% に近づくため、small-object 向けの pf/OS レイヤをまとめて削る。
|
||||
- C7/C6 v4 が揃った状態を前提に、Superslab 配置と Segment 分割を見直し、触る Superslab 数と VMA 数を減らす。
|
||||
- まだ実装は行わず、箱の分割とパラメータの置き場所を決める段階。
|
||||
|
||||
## 現状のレイアウト(把握用)
|
||||
- Superslab サイズは既存の Tiny/Superslab のまま(4KiB ページ上で C1〜C7 を混載)。
|
||||
- C5〜C7 のページが混在し、Mixed では 1M ops あたりに跨る Superslab が多い。
|
||||
- pf としては `mmap/madvise/munmap` の回数が小さくない。C7-only v4 でも minor-faults がボトルネック側に寄りつつある。
|
||||
|
||||
## small-object 専用 Segment 案(方向性)
|
||||
- Superslab を small-object 専用に 2MiB/4MiB 単位でまとめ、C5〜C7 をできるだけ同一 Segment 内に詰める。
|
||||
- Mixed で触る Superslab の種類を減らし、TLB/pf を削る。
|
||||
- Box 化のイメージ:
|
||||
- **SmallSegmentBox_v4**: Segment の取得/解放と page carving を担当。SuperslabBox/OS を内側で呼ぶ。
|
||||
- **SmallSegmentEnvBox_v4**: ENV で Segment サイズやポリシーを決定(例: `HAKMEM_SMALL_SEGMENT_V4_SIZE=2M/4M`)。
|
||||
- **SmallSegmentStatsBox**: 触った Segment 数、mmap/madvise 回数、ページ再利用回数をカウントし、PF 調査用にダンプ。
|
||||
- HotBox_v4 からは ColdIface を通して Segment Box に触れるだけにし、ホットパスは segment/pf を意識しない。
|
||||
|
||||
## 今後のフェーズ
|
||||
- **PF2(今回)**: 現状の pf/OS ベースラインを v4 状態で取り直し、Segment Box の箱だけ追加(挙動不変)。
|
||||
- **PF3**: SmallSegmentBox_v4 を実装し、C7/C6 v4 で small-object 専用 Segment を試す A/B を実施。
|
||||
- **PF4**: Segment サイズ/ポリシーのチューニングと pf/OS スタッツの可視化強化。成功したら ENV プリセットに反映。
|
||||
|
||||
## メモ
|
||||
- C5 v4 はまだ研究箱(C5-heavy 専用)。Mixed では C5 v1 を維持する予定。
|
||||
- C6 v4 は C6-heavy で +4〜5% が見えており、Mixed ではデフォルト OFF(研究箱)。
|
||||
- PF 系の変更はすべて ENV ゲート付きにし、既存の Mixed/C6-heavy 健康診断がいつでも通る状態を維持する。
|
||||
@ -16,8 +16,10 @@
|
||||
- **v4-2**: C7-only を v4 に寄せ、v3 互換の挙動で動かす(ENV ゲート付き、v4 が優先)。
|
||||
- **v4-3**: C7-only を v4 自前の freelist/current/partial で動かす(Cold は Tiny v1 経由)。v3 はベンチ用に残し ENV で A/B。
|
||||
- **v4-3.1 (今回)**: C7 v4 で current/partial 再利用を強化し、prepare_calls を v3 並みに抑制。C7-only ベンチで v4 が v3 比 +1% 程度まで回復。
|
||||
- **v4-4**: C5〜C7 を含む全 small-object クラスを v4 に段階移行。route LUT から v4 を返せるようにする。
|
||||
- **v4-5**: Segment/Page/Block レイアウトと pf 削減、WarmPool チューニングを v4 用に調整。
|
||||
- **v4-4**: C6 v4 パイロット(C6-heavy 専用 opt-in)。C7 v4 を維持しつつ C6 を v4 に載せる。
|
||||
- **v4-5**: C5 v4 パイロット(C5-heavy 専用 opt-in)。Mixed 標準は C5 v1 のまま。
|
||||
- **PF2 (今回)**: v4 状態での pf/OS ベースライン取得と small-object Segment Box の箱だけ追加(挙動不変)。
|
||||
- **v4-6 / PF3 以降**: Segment/Page/Block レイアウトと pf 削減、WarmPool チューニングを v4 用に調整。
|
||||
|
||||
## 現行 v3/v2 の扱い
|
||||
- v3: C7-only front v3 の prototype として構造だけ再利用する。性能・安定のベースライン。
|
||||
@ -28,6 +30,7 @@
|
||||
- `core/box/smallobject_cold_iface_v4.h`: ColdIface の関数ポインタ箱(C7 専用 refill/retire を v1 Tiny に繋ぐ)。
|
||||
- `core/box/tiny_route_env_box.h`: `TINY_ROUTE_SMALLHEAP_V4` を追加し、ENV `HAKMEM_SMALL_HEAP_V4_ENABLED` / `HAKMEM_SMALL_HEAP_V4_CLASSES` から C7 を v4 route に載せられる(未指定なら OFF)。
|
||||
- `core/front/malloc_tiny_fast.h`: route switch に v4 の case を足し、C7 v4 が ON のときは v4 経路(現在は C7 自前 freelist, それ以外は v1/v3 へフォールバック)、OFF 時は従来の v3/v1。
|
||||
- `core/box/smallsegment_v4_box.h` / `core/box/smallsegment_v4_env_box.h`: PF2 で追加した small-object Segment Box の足場(型と ENV だけ、挙動不変)。設計メモは `docs/analysis/SMALLOBJECT_SEGMENT_V4_DESIGN.md` にまとめる。
|
||||
|
||||
## A/B と運用
|
||||
- Phase v4-3.1 時点の健康診断:
|
||||
@ -44,3 +47,7 @@
|
||||
- C6 v1: 28.69M ops/s
|
||||
- C6 v4: 30.07M ops/s(+4.8%)segv/assert なし
|
||||
- Mixed 16–1024B はデフォルトで C6 v1 のまま(C6 v4 は研究箱)。今後 C6 v4 の安定度を見つつ拡張予定。
|
||||
- Phase v4-5 (C5 v4 パイロット; C5-heavy 専用 opt-in):
|
||||
- ENV: `HAKMEM_SMALL_HEAP_V4_ENABLED=1`, `HAKMEM_SMALL_HEAP_V4_CLASSES=0x20`(C5-only v4)。C7 v4 / C6 v4 とは独立にビットで切替。
|
||||
- 目的: C5-heavy ワークロードで v4 が v1 を上回るか確認。Mixed 標準は C5 v1 のまま(C5 v4 は研究箱)。
|
||||
- ステータス: 実装済み。C5-heavy / Mixed の A/B は未実施。segv/assert の有無と throughput を確認してから昇格判断。
|
||||
|
||||
Reference in New Issue
Block a user