Files
hakmem/docs/analysis/LARGE_GLOBALS_OVERVIEW.md

85 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

LARGE_GLOBALS_OVERVIEW
======================
概要
----
- `nm -S --size-sort bench_random_mixed_hakmem` で確認した巨大 BSS/静的領域の上位シンボルをメモ。
- 目視での役割・要素数イメージと、直近の SS_STATS短い run, ws=64, iters=10k, HAKMEM_SS_STATS_DUMP=1のギャップを併記。
- 目的: 次フェーズの「SuperReg/SharedPool/Remote を動的化 or 縮小」設計の入力にする。
コマンド
--------
```bash
nm -S --size-sort bench_random_mixed_hakmem | tail -n 120
HAKMEM_SS_STATS_DUMP=1 ./bench_random_mixed_hakmem 10000 64 1 2> /tmp/ss_stats_sample.log
```
観測された大きめシンボル
------------------------
| Symbol | Size | 役割/箱 | 備考・ギャップ |
| --- | --- | --- | --- |
| `g_super_reg` | 0x1800000 ≈ 24.0 MB | Super Registry 全体 | SS_STATS では C2=1, C7=1 live と極小。大半が未使用の固定配列。 |
| `g_rem_side` | 0x1000000 ≈ 16.0 MB | Remote Queue 側バッファ | スレッド数・ード数に対してオーバーサイズ。bench ではほぼ未使用。 |
| `g_shared_pool` | 0x238140 ≈ 2.23 MB | Shared Pool テーブル | live SS 2 枚に対し容量が大きい。class 別縮小余地あり。 |
| `g_super_reg_by_class` | 0x100000 ≈ 1.0 MB | クラス別 SuperReg インデックス | クラス数 8 に対し 1MB 固定。動的化で圧縮可能。 |
| `g_free_node_pool` | 0xC0000 ≈ 0.75 MB | Free ノードプール | Remote/Pool 用。小さくはないが上位ほどではない。 |
| `g_mf2_page_registry.lto_priv.0` | 0x82810 ≈ 0.51 MB | MF2 ページレジストリ | MF2 経路用。 |
| `g_tls_mags` | 0x40040 ≈ 0.26 MB | TLS Magazine 配列 | スレッド数ぶん前提。実使用は少数。 |
| `g_site_rules` | 0x40040 ≈ 0.26 MB | Site rule テーブル | 固定長。 |
| `g_mid_desc_mu` | 0x14000 ≈ 80 KB | Mid-size desc | 中規模。 |
| `g_mid_tc_mu` | 0xA000 ≈ 40 KB | Mid-size TC | 中規模。 |
| `g_pool.lto_priv.0` | 0x9680 ≈ 37 KB | Pool 配列 | 中規模。 |
| `g_tiny_page_box` | 0xC40 ≈ 3.1 KB | Tiny Page Box 配列 | Tiny Front 系。微小。 |
| `g_tls_hot_mag` | 0x2040 ≈ 8 KB | TLS Hot Magazine | 微小。 |
| `g_fast_cache` | 0x2200 ≈ 8.6 KB | Fast cache | 微小。 |
補足SS_STATS サンプル)
-------------------------
- 短い runws=64, iters=10k, Release, HAKMEM_SS_STATS_DUMP=1の結果:
- `[SS_STATS] class live empty_events slab_live_events`
- `C2: live=1 empty=0 slab_live=0`
- `C7: live=1 empty=1 slab_live=0`
- `[RSS] max_kb=29568`
- 「巨大配列の容量」に対し「実際に live の Superslab」は 2 枚のみ。固定長 BSS が RSS を支配していることが確実。
定義元と役割(コード位置)
--------------------------
- Super Registry (`core/hakmem_super_registry.{h,c}`)
- `g_super_reg[SUPER_REG_SIZE]` … ハッシュ登録(デフォルト 1,048,576 エントリ = 24MB、`SUPER_REG_SIZE` で調整可能)
- `g_super_reg_by_class[TINY_NUM_CLASSES][SUPER_REG_PER_CLASS]` … クラス別スキャン用(デフォルト 8×16384 = 128K スロット ≈1MB
- `g_super_reg_class_size[]` … クラス別 live カウント
- `g_ss_lru_cache` … LRU 再利用キャッシュ(メモリは小さめ)
- Shared Pool (`core/hakmem_shared_pool.{h,c}` + `_acquire.c` + `_release.c`)
- `g_shared_pool` … Superslab 配列、クラス別ヒント/活性/フリーリスト/メタ配列を同居させた大きめ struct≈2.3MB
- `g_shared_pool.ss_metadata[]` … Superslab ごとのメタデータ配列
- Remote Queue (`core/tiny_remote.c`)
- `g_rem_side[REM_SIDE_SIZE]` … cross-thread free のハッシュ(`REM_SIDE_LOG2=20` → 1M エントリ ≈16MB
- Debug 時の `g_rem_track[]` は release では落ちるのでサイズ影響なし
- Free Node Pool (`core/pool_refill.c` など)
- `g_free_node_pool` … pool refilling 用のードストック≈0.75MB
- TLS / MF2 系
- `g_tls_mags` (`core/hakmem_tiny_magazine.c`) … TLS マガジン配列≈0.26MB、スレッド数前提)
- `g_mf2_page_registry` (`core/mf2*`) … MF2 併用時のページレジストリ≈0.5MB
- `g_ss_addr_map` (`core/box/ss_addr_map_box.h`) … Superslab アドレス検索ハッシュ(サイズは中程度)
ベンチ向け縮小の目安(案)
--------------------------
- SuperReg
- 現状: `SUPER_REG_SIZE=1,048,576`24MB`SUPER_REG_PER_CLASS=16384`1MB
- Bench 目安: `SUPER_REG_SIZE_BENCH=65,536`~1.5MB)、`SUPER_REG_PER_CLASS_BENCH=1024`~64KB
- Shared Pool
- 現状: capacity は動的拡張だが初期サイズは大きめ(約 2.3MB
- Bench 目安: 初期 capacity を 64〜128 に抑え、クラス別スロットも縮小
- Remote Queue
- 現状: `REM_SIDE_LOG2=20` → 1M エントリ16MB
- Bench 目安: `REM_SIDE_LOG2=16`64K エントリ ≈1MB程度まで削減
- Free Node Pool / TLS Mag / MF2
- Bench ではスレッド数や MF2 オンオフに応じて「初期化を遅延」「固定配列を半減」する余地あり。
次の設計ステップBox 化の方向性)
-----------------------------------
- SuperReg/SharedPool/Remote を Box 化し、`HAKMEM_PROFILE`prod/full/bench/larson_guard 等)で容量を切替できるようにする。
- Bench 用の小型プロファイルregistry/pool/remote を 1/4〜1/8を追加し、RSS を抑えた状態で mimalloc/system と比較する。
- Superslab Budget Box と組み合わせ、live 枚数上限(予算)と「空 SS 再利用ポリシー」を分離して管理する。***