Files
hakmem/docs/analysis/LARGE_GLOBALS_OVERVIEW.md

5.5 KiB
Raw Blame History

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 縮小」設計の入力にする。

コマンド

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,57624MBSUPER_REG_PER_CLASS=163841MB
    • 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=1664K エントリ ≈1MB程度まで削減
  • Free Node Pool / TLS Mag / MF2
    • Bench ではスレッド数や MF2 オンオフに応じて「初期化を遅延」「固定配列を半減」する余地あり。

次の設計ステップBox 化の方向性)

  • SuperReg/SharedPool/Remote を Box 化し、HAKMEM_PROFILEprod/full/bench/larson_guard 等)で容量を切替できるようにする。
  • Bench 用の小型プロファイルregistry/pool/remote を 1/4〜1/8を追加し、RSS を抑えた状態で mimalloc/system と比較する。
  • Superslab Budget Box と組み合わせ、live 枚数上限(予算)と「空 SS 再利用ポリシー」を分離して管理する。***