85 lines
5.5 KiB
Markdown
85 lines
5.5 KiB
Markdown
|
|
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 サンプル)
|
|||
|
|
-------------------------
|
|||
|
|
- 短い run(ws=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 再利用ポリシー」を分離して管理する。***
|