用途与实际影响
这项功能怎样使用
为什么需要它
2026-07-23本机曾出现约1GiB文件却占着约31GiB内存、镜像约31.98GiB的情况。将盘从32GiB降到12GiB限制最大预算,重建机制则处理文件已减少而驱动仍保持高水位的情形。这个历史原因不等于每一次低内存都由Primo造成。
举个实际例子
“我清掉了缓存,但内存没回来。”守护器自己多次采样,再检查当前是否有人用盘、本人有没有暂停以及是否仍在等待期;任何条件不清就保留现场。全部满足才认准目标盘并尝试恢复。
最后我会得到什么
交回这次为什么没有重建,或重建每一步做了什么及内存是否真的改善。失败会暂缓再试;清空后的应用缓存可能需要重新加载。
正常工作
没有满足重建条件时继续保留缓存并记录原因;达到条件且每一步都通过时再核对实际内存变化。
发现问题
持续压力、当前使用者、本人暂停和等待期必须一起检查;收益不明或失败时先冷却,不反复清盘。
暂不可用
Primo 不在、目标盘认不准、权限或恢复步骤失败时报告错误;不能称已经释放内存。
从哪里开始
在已接通这台电脑的 AI 对话中说“缓存删了但内存没回来,查守护器为什么没有重建”;AI 读本轮条件,自动重建仍只在原任务满足全部门槛时发生。
需要准备什么
- 出现“缓存删了但内存没回来”的症状
- 是否希望先只读解释本次为什么未重建
从开始到拿到结果
- 1
守护器确认持续异常
它自己连续采集至少三次内存压力并核对 Z 占用;条件不足就只记录。
- 2
排除会受影响者
它检查活动用户、未知使用者、暂停、冷却和唯一磁盘身份;任一条件不满足就不重建。
- 3
重建后量收益
允许时重建并恢复目录,重新采样内存;收益不足或无法证明就冷却,失败可能已清缓存。
技术实现与依据
这里保留实现、关键条件、精确入口、历史记录和验证结果。
修复后隔离回归通过关键规则与设计选择
原资源阈值只产生候选,至少10秒3样本持续压力和其他条件全部通过才允许重建;unaccounted仍是估算,不是驱动泄漏证明。
两种触发都要求盘已用<=8GiB;超上限保留现场并告警,不自动清盘。
当前0号对应Z只是现场事实;自定义盘符从ls解析,不再硬编码0。同盘出现其他卷或多个匹配时零初始化。
本模块用到的名词
- 不可归属内存估算
- 总已用物理内存扣除工作集、内核池、缓存和修改页等计数;共享页重复计数使健康历史基线约-4GiB,数值可随负载变化。
- 驱动高水位占用
- 文件已经删去,但驱动仍持有曾经分配的内存;本机有历史证据,不能推断所有Primo版本和所有内存问题都相同。
专业定义
处理本机曾出现的Primo高水位占用,不把估算当成精确泄漏诊断。
解决什么
清空可重建缓存仍可能打断正在使用它的应用。估算的异常不能严格证明某一个驱动泄漏,8GiB占用条件也不证明盘里绝无误放的唯一资料。
当前怎样实现
- Read-UnaccountedGB读取Available Bytes、Modified Page List Bytes、Cache Bytes、Pool Paged Bytes、Pool Nonpaged Bytes和Process(_Total)/Working Set,再与Win32_OperatingSystem的TotalVisibleMemorySize计算差值;失败返回null。
- 压力谓词仍为(available<5GiB或unaccounted>=8GiB)且used<=8GiB,但触发前至少10秒取得3次连续样本,间隔超过30秒重新确认。消费者活动/证据未知、用户暂停或冷却均拒绝重建,不能用单拍判断。
- Resolve-PrimoDiskIndex从rxprd ls的编号行和卷列表解析配置盘符;要求唯一且同盘没有其他卷。
- Invoke-PrimoCommand检查实际退出码。流程为init <index> -s,等待2秒,恢复目录/说明/隐藏标记,再save <index> -s;初始化和骨架失败不继续save,任何失败都不记录release done。
- 命令成功后再次读取空间和内存并记录实际值;不能证明可用内存至少改善1GiB时延长冷却到6小时,这不是承诺每次都能释放1GiB。没有自建超时服务,现有计划任务总时限为10分钟。
- 尝试至少间隔1小时,失败暂缓1小时;实际回读无法证明至少1GiB内存改善则暂缓6小时。Set-RamdiskRecoveryMode恢复自动模式不清冷却。消费者租约绑定PID、创建时间和期限,与重建共用互斥;只证明已接入者,不承诺所有旧应用占用保护。
执行流程
- 1
至少10秒取得3次连续压力样本,间隔超过30秒从头确认;同时核对Z占用。
- 2
查活动和未知使用者、本人暂停及当前冷却期;任一条件阻断就保持原状并记原因。
- 3
查询Primo并确认唯一磁盘编号及没有其他卷。
- 4
初始化选中盘,恢复基础结构后保存镜像。
- 5
失败记录ERROR并至少冷却1小时;成功后重新采样,改善不足1GiB或无法证明时冷却6小时。
边界
- 本轮未执行真实init/save;隔离测试不能冒充实盘恢复或自然重启。
- 不自动删除其他Owner缓存里的特定内容,也不重置全部系统内存。
- 若初始化成功但之后失败,缓存已可能清空;ERROR不意味着所有前步骤已回滚。
失败与恢复
- 盘符无法唯一映射或同盘包含其他卷
- 不调用init,不猜编号,保留ERROR供核对配置。
- init失败
- 不调用save,不宣称完成,记录Primo退出结果。
- 目录/说明恢复或save失败
- 记录失败阶段;目录恢复失败不保存,save失败不宣称镜像已更新。
真实入口
zguardian.ps1计算、阈值、唯一编号解析、实际命令与恢复。
tests/Test-RamdiskGuardianRecovery.ps1真实生产恢复分支的10个隔离情形。
README.md本机历史故障与当前预算。
如何验证
- 旧源码的初始化失败夹具返回0且报告完成,故障已复现。
- PS7/5.1均通过:默认盘成功、自定义盘索引成功、init失败、save失败、说明恢复失败、目标不存在、重复目标、多卷、ls失败、Primo不存在。
- 仅只读Primo设置和当前任务,本轮没有实盘重建E2E(端到端验证)。
与其他模块的关系
恢复依赖第一模块的缓存约定和下一模块的Primo/计划任务安装,不能独立承诺数据保护。
