Study PVC Evictor

作用

vLLM 的 offloading connector 会不断把 KV 缓存文件写到 PVC 上。如果磁盘写满,vLLM 的 cache 写入会失败,甚至导致 K8s 驱逐整个 Pod。

PVC Evictor 就是用来自动监控和清理 PVC 上的旧缓存文件。它会区分冷热数据,只删除长时间未访问的冷文件,从而保证 vLLM 持续运行而无需人工干预。

原理:N+2 多进程架构

主进程 evictor.py 创建共享变量并启动 N+2 个子进程:

共享变量 (IPC)

deletion_event: Activator 控制 Deleter 的开关(磁盘满时开启) shutdown_event: Main 通知所有子进程退出 deletion_queue: Crawler 放文件路径,Deleter 从中取 result_queue: 所有子进程向 Main 汇报统计数据

evictor.py (Main Process)

  1. 等待 PVC 挂载就绪
  2. 创建 2 个 Event 和 2 个 Queue 共享对象
  3. 启动 N 个 Crawler、1 个 Activator、1 个 Deleter
  4. 进入监控循环:收集统计信息打日志,检查子进程存活,挂了就重启
  5. 收到 SIGTERM 信号时通知所有子进程优雅退出

processes/crawler.py (Crawler Process, N 个)

  1. 分配 hex 范围(如 8 个 Crawler 时,P1 负责 0-1,P2 负责 2-3),避免重复扫描
  2. 按 llmd-fs-backend 的目录结构流式遍历文件,一次只吐一个路径,内存占用恒定
  3. 检查文件 atime,跳过最近 60 分钟内访问过的热文件
  4. 根据 deletion_event 状态控制投放节奏:删除关闭时只预填 MINQ(1000) 个,删除开启时填满 MAXQ(10000) 个
  5. 扫完一轮等 1 秒再重扫,定期汇报统计

processes/activator.py (Activator Process, 1 个)

  1. 每 0.5 秒用 statvfs() 检查磁盘使用率(O(1) 操作,瞬间完成)
  2. 迟滞控制:超过 85% 设置 deletion_event 开启删除,降到 70% 清除事件停止删除
  3. 用两个阈值防止在临界点频繁抖动
  4. 定期汇报磁盘使用率给 Main 进程

processes/deleter.py (Deleter Process, 1 个)

  1. 等待 deletion_event 被设置才开始工作,否则清空当前批次休眠
  2. 从 deletion_queue 取文件攒批次,攒满 100 个(batch_size)执行一次删除
  3. 如果 5 秒没新文件进来(超时),即使没攒满也先删一批,防止积压
  4. 用 xargs rm -f 系统命令批量删除,比 Python 循环 os.remove 更快
  5. 每次删完通过 result_queue 汇报删除数量和释放空间

helm

生成了一个挂载了PVC的deployment