跳转到内容

实时监控

SpaceKnife 的扫描结果不是一张会过期的照片。标签开着的时候,SpaceKnife 一直监视扫描过的位置,把每一处变化合并进树里:越下越大的文件、刚删掉的构建目录、刚装好的游戏更新。树图、详情面板、可用空间和删除篮都会自己跟上。

监控和扫描同时开始,扫描还没结束时发生的变化也不会丢;关闭标签时停止。打开的快照从不监控:它本来就是过去的状态。

  • 闪烁:内容变了的块闪两下,然后淡出。变化的项太小、没有自己的块时,闪的是包含它的那个块。
  • 静态角标:打开「减少动画」(设置 › 外观 › 动画)后不再闪烁,改为在块上写出大小的变化,例如 +212 MB、−1.2 GB,停留约 10 秒;块里放得下才显示。
  • 其他数字一起变:所有上级文件夹的大小、可用空间与未知空间块、状态栏的可用空间(最多每秒重读一次)、删除篮里的大小都随之更新。

想完全不闪,关掉「元素变化闪烁」(设置 › 可视化 › 变化提示)。这个开关同时控制扫描中文件夹的呼吸描边。

状态栏里的实时监控一项显示当前标签的监控状态。悬停看详情,单击开关实时监控。

状态栏显示 含义
实时监控中 每个扫描过的文件夹都由系统的变化通知监视。提示里是已应用的变化数(「{n} 处变化已更新」)和还在排队的数量(「{pending} 项待处理」)。
实时监控 · 启动中 正在建立监视(FSEvents 可能要稍等片刻)。
实时监控 · 部分轮询 部分或全部文件夹改用轮询。提示里写着原因,例如「inotify 监视额度不足,{count} 个文件夹改为轮询」。
实时监控 · 失败 监视已停止。提示里写着原因,例如「监视的文件夹已被删除」。
实时监控已关闭 实时监控是关着的。
快照 · 不监控变化 这个标签显示的是快照。
实时监控 · 扫描后自动开启 这个标签还没有扫描,实时监控是开着的。

SpaceKnife 选系统能提供的最好的机制,用不了时退回轮询。监视器只负责报告「哪里变了」;新增、删除、改名这类结构变化,一律重新列出所在文件夹得到准确结果,所以树最终和磁盘上一致。

  • 每个扫描根一个递归的 ReadDirectoryChangesExW 监视。它的扩展信息自带文件的新大小、占用和修改时间,所以文件变大时原地更新,不用再读一次磁盘。
  • 不提供扩展信息的卷或文件系统退回 ReadDirectoryChangesW,这时大小变化要重新列出文件夹才能得到。
  • 系统的通知缓冲区溢出意味着丢了事件。如果已提权的扫描助手已经在运行(MFT 快速扫描启动过它),SpaceKnife 从最近的检查点读取 NTFS 的 USN 变更日志,只重新列出真正被动过的文件夹;否则把受影响的子树重新读一遍。SpaceKnife 不会为了监控而请求管理员权限。
  • 扫描根被删除、移动或改名时,这个根的监控停止,显示「失败」。
  • 每个文件夹一个 inotify 监视。新文件夹一出现就加上监视并立即读取内容,所以「mkdir 后马上写入」或整棵目录树移进来都不会漏。
  • 所有打开的扫描共用 fs.inotify.max_user_watches 的 80% 作为额度,超出额度的文件夹改为轮询,状态栏显示「部分轮询」。
  • 网络文件系统(NFS、SMB)和 WSL 下的 Windows 盘始终轮询:别的机器(或 Windows)做的改动,内核根本收不到通知。
  • 内核的事件队列溢出时,SpaceKnife 等安静下来后把监视的树重新读一遍,丢失的事件不会被悄悄忽略。
  • 每个扫描根一个 FSEvents 事件流。系统报告丢了事件时,重新读取受影响的文件夹。
  • FSEvents 启动不了时改为轮询。

轮询是所有平台的兜底:每 30 秒比对一轮各文件夹的修改时间,每秒最多检查 2000 个文件夹,保持很轻的后台负载。

  1. 合并:事件攒到「事件合并间隔」(默认 150 ms)内没有新事件时一起处理;事件一直不停时,也至少每秒处理一次。
  2. 更新:大小或时间变了的文件原地更新;条目变了的文件夹用扫描的同一套代码重新列出一层;新出现的文件夹接着扫描。
  3. 事件风暴:一批要动的文件夹超过 2000 个或事件超过 20000 条时(解压大压缩包、大规模 git checkout),SpaceKnife 不再逐条追,而是标记它们共同的文件夹,安静 2 秒后整体重新读取。日志面板(Ctrl+J)里会记一条「文件变化过多」。
  4. 扫描进行中:扫描还没读到的文件夹里的变化,交给扫描自己读到;MFT 快速扫描期间,所有变化等整棵树就绪(几秒)后再应用。

实时监控开着时很少需要,但想确认结果、关掉了监控、或轮询漏掉了大小变化时可以用。

操作 方法 读取范围
重新扫描此文件夹 右键 › 「重新扫描此文件夹」 这个文件夹及其下全部内容;对文件则是它所在的文件夹。
重新扫描当前视图 命令面板(Ctrl+K)›「重新扫描当前视图」 当前放大进入的文件夹及其下全部内容。
全盘重新扫描 命令面板 ›「全盘重新扫描」 在同一个标签里重新扫描同样的位置。
  • 文件夹的重新扫描立即开始(不等安静期),实时监控关闭时也能用。
  • 重新扫描后有变化的块照常闪烁。
  • 标签里的扫描还在进行时,不能重新扫描文件夹:「扫描进行中,完成后再重新扫描」。

硬扫描中途停止后,已扫描的结果保留,没读到的文件夹也记着。状态栏会出现「继续扫描」(提示:「还有 {n} 个文件夹没有读取」)。单击它,或在命令面板里运行「继续已停止的扫描」,扫描就从停下的地方接着读;读完后像其他完成的扫描一样保存为快照。

只有硬扫描可以继续。MFT 快速扫描几秒就完成,没有可以继续的部分。

设置 位置 默认 作用
实时监控 扫描与性能 › 实时监控 开 监视打开的扫描。和状态栏那一项是同一个开关。
事件合并间隔 扫描与性能 › 实时监控 150 ms 此时间内的连续变化合并为一次刷新(50–5000 ms)。某个文件夹一直在变、树图忙个不停时可以调大。
元素变化闪烁 可视化 › 变化提示 开 变化的块闪烁(或显示角标)。
减少动画 外观 › 动画 跟随系统 开:用静态角标代替闪烁。

Ctrl+, 打开设置,完整列表见设置。

  • 只监视扫描过的位置。扫描不会进入扫描文件夹里的挂载点,所以挂载点也不在监视范围内。
  • 监控只在内存里进行,SpaceKnife 关着的时候什么也不记录。想知道上次扫描以来变了什么,用快照对比。
  • 轮询的文件夹发现不了已有文件的大小变化(见上文)。
  • 监控失败或总是退回轮询,见故障排除。