mds 和 mdworker 占用 CPU 过高怎么办
名为 mds、mds_stores 或 mdworker 的进程,属于 Spotlight 元数据和搜索索引系统。系统更新、迁移、恢复或大量文件变化后,短时间占用升高很正常。不过,mdutil -s 本身不能说明是否正在重建,也不存在固定的「一小时一定结束」。
先确认触发原因和进度,再考虑重建索引或排除目录。
mds 和 mdworker 是什么
它们共同组成 Spotlight 索引引擎。mds 是元数据服务器,负责协调索引;mds_stores 管理数据库;mdworker 进程实际扫描文件,把内容和元数据变成可搜索信息。
索引处于最新状态时,它们大多保持空闲。文件变化使索引过期后,它们会重新开始处理,这就是你看到的 CPU 占用。
为什么会突然升高
大量文件同时变化时,Spotlight 会重新索引:
- macOS 更新或数据迁移后, 磁盘上大量内容发生变化。
- 移动或复制大量数据后, 比如恢复文件或克隆硬盘。
- 接入新的外置盘或网络卷后, 这些卷之前尚未建立索引。
- 包含大量文件的目录持续快速变化时, 比如一个大型下载刚完成。
检查索引是否启用:
mdutil -s /
「Indexing enabled」是正常状态,不是进度报告。应把持续的 mdworker CPU 与「活动监视器」中的磁盘活动、近期文件变化放在一起看。如果工作确实在推进,保持 Mac 接通电源并等待完成。
大型源码目录、邮件存储、外置卷、速度较慢的存储设备,以及同步造成的反复变化,都会延长处理时间。
一直无法结束时怎么办
活动长期不平息时,先停止那个持续重写文件的应用,再断开一个可疑外置卷进行隔离。
在「系统设置 > Spotlight > 搜索隐私」中排除目录,可以降低索引成本,但代价是失去该目录中的 Spotlight 结果。它适合生成的构建目录、虚拟磁盘,或确实从不需要搜索的归档,不适合把整个个人目录或启动磁盘一并排除。
如果搜索结果已经缺失,或索引能够证明已经卡住,Apple 提供了通过同一隐私列表重建的方法:加入受影响磁盘或文件夹,短暂等待,再把它移除。当前的 Spotlight 重建说明中,这个按钮会因 macOS 版本不同而显示为「搜索隐私」或「Spotlight 隐私」。移除后,Spotlight 会重新索引该项目。
重建会有意把昂贵工作再做一遍,因此它是修复步骤,不是看到普通 CPU 活动后的第一反应。
Spotlight 索引怎样工作,又是什么迫使它重建
Spotlight 会在每个卷隐藏的 .Spotlight-V100 存储中维护倒排索引,也就是从词语和元数据映射回包含它们的文件。
文件变化后,内核的 FSEvents 机制通知 mds;mds 把文件交给 mdworker;mdworker 再加载对应文件类型的导入插件 .mdimporter,提取文本和元数据。一次普通编辑成本很低,完整重建则很昂贵,因为每个符合条件的文件都要重新导入。
部分更新、迁移和恢复会触发大范围重新索引,但具体范围各不相同。隐私排除之所以能减少工作,是因为你主动放弃了该子目录的搜索能力,所以范围必须克制且明确。
把索引活动和文件变化对上
「活动监视器」或 Mole「状态」页可以确认 CPU 与磁盘占用来自 Spotlight。更难的问题是,这项工作来自一次有尽头的文件变化,还是来自持续改写的目录。查看近期活动并进行受控隔离,才能回答这个问题,强制结束工作进程不能。
按这个顺序排查
确认索引已开启,把 CPU 与磁盘活动、近期文件变化关联起来,在进度合理时等待。活动持续不退时,隔离不断变化的目录或磁盘卷。只排除不需要搜索的数据,只有搜索结果或索引行为证明有必要时,才通过「搜索隐私」重建。
不要把结束 Spotlight 工作进程当作清理策略。