Skip to content

shm 运行期动态扩缩容:容量在创建时锁死,缺 mremap/回收路径 #15

Description

@miaobyte

现状

kvspaceShmOpen(path, data_size)创建时用固定 data_size 决定容量:

  • data_size 一次性算出 shm_totalkvspace_hdr + blocks_meta + ART_SLAB + sbo_head + data_size),ftruncate 到该大小,单次 mmap 整块映射。
  • 再次打开已存在的文件时,data_size 直接从头部 sbo_data_size 读回——沿用创建时的容量,不可更改
  • 底层 slotsboxmalloc 变长区(sbo_data)与 ART slab 均在这块固定映射内分配。

即:容量在 shm 创建时锁死,运行期无扩容/缩容路径。写入超过初始容量只能失败或需要用户预先按峰值超额分配。

问题

这是方案 2(tensor.data 由 extstore 后端管理,见 #14)目前无法直接落到 shm 上的根因之一:tensor data 体量动态且可达 GB 级,固定容量的 shm 无法在运行期按需扩张。

需要设计

运行期动态扩缩容,候选方向(待定档):

  • 扩容ftruncate 增大 backing file + mremap(Linux)重新映射;多进程共享场景下如何让所有 attach 方感知新映射基址/大小(版本号 + 重映射握手,或固定虚拟地址预留 + 按需 mmap 提交)。
  • 缩容slotsboxmalloc 空闲区回收 + fallocate(PUNCH_HOLE) 释放物理页,或整理后 ftruncate 收缩。
  • 地址稳定性:ART 节点与 slotsbox 存的是 offset 而非指针(利于重映射),需确认所有跨进程引用都是 offset-based、不缓存裸指针。
  • 并发:扩缩容期间的读写栅栏 / 版本切换,避免撕裂。

交付

先出设计文档(元存 + 扩展存储两层各自的扩缩容策略),再实现。解决后回填 #14 的方案 2 可行性判断。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions