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)
- 等待 PVC 挂载就绪
- 创建 2 个 Event 和 2 个 Queue 共享对象
- 启动 N 个 Crawler、1 个 Activator、1 个 Deleter
- 进入监控循环:收集统计信息打日志,检查子进程存活,挂了就重启
- 收到 SIGTERM 信号时通知所有子进程优雅退出
processes/crawler.py (Crawler Process, N 个)
- 分配 hex 范围(如 8 个 Crawler 时,P1 负责 0-1,P2 负责 2-3),避免重复扫描
- 按 llmd-fs-backend 的目录结构流式遍历文件,一次只吐一个路径,内存占用恒定
- 检查文件 atime,跳过最近 60 分钟内访问过的热文件
- 根据 deletion_event 状态控制投放节奏:删除关闭时只预填 MINQ(1000) 个,删除开启时填满 MAXQ(10000) 个
- 扫完一轮等 1 秒再重扫,定期汇报统计
processes/activator.py (Activator Process, 1 个)
- 每 0.5 秒用 statvfs() 检查磁盘使用率(O(1) 操作,瞬间完成)
- 迟滞控制:超过 85% 设置 deletion_event 开启删除,降到 70% 清除事件停止删除
- 用两个阈值防止在临界点频繁抖动
- 定期汇报磁盘使用率给 Main 进程
processes/deleter.py (Deleter Process, 1 个)
- 等待 deletion_event 被设置才开始工作,否则清空当前批次休眠
- 从 deletion_queue 取文件攒批次,攒满 100 个(batch_size)执行一次删除
- 如果 5 秒没新文件进来(超时),即使没攒满也先删一批,防止积压
- 用 xargs rm -f 系统命令批量删除,比 Python 循环 os.remove 更快
- 每次删完通过 result_queue 汇报删除数量和释放空间
helm
生成了一个挂载了PVC的deployment