如果你的Mac突然变得反应迟钝,风扇狂转不止,或者硬盘指示灯闪个不停,那很可能是某个进程正在疯狂读写磁盘。系统自带的“活动监视器”虽然能告诉你哪个程序在“搞事情”,但它不会直接指出具体是哪些文件在作祟。别担心,我们可以通过一套组合拳,从识别高负载进程开始,一步步追踪到具体的文件源头。下面就是几种行之有效的Mac磁盘IO排查方法。
一、使用活动监视器定位高磁盘I/O进程
排查的第一步,自然是利用系统原生工具快速锁定目标。活动监视器里的“磁盘”标签页,就像是一个实时交通监控屏,能清晰展示当前哪些进程正在占用最多的磁盘带宽。虽然它不显示具体的文件路径,但提供的进程名、PID以及实时的读写速度,已经为我们指明了深入调查的方向。
操作起来很简单:按下 Command + Space 打开聚焦搜索,输入“活动监视器”并启动它。然后,点击顶部的“磁盘”标签。如果默认视图里没有显示详细的读写数据,可以在表头区域右键,勾选“读取字节/秒”和“写入字节/秒”。接着,点击“写入字节/秒”或“读取字节/秒”进行降序排列,排在前面的就是当前的“磁盘大户”。对于可疑进程(比如 mdworker、backupd 或者一些第三方应用的更新程序),你可以右键选择“在 Finder 中显示”,进一步确认其可执行文件的位置。
二、通过lsof命令查看进程打开的文件列表
找到了可疑进程,下一步就是看看它到底在操作哪些文件。这时候,终端里的 lsof 命令就派上用场了。这个命令能列出指定进程当前打开的所有文件句柄,包括正在读写的文档、日志、缓存数据库等等。
具体怎么做呢?首先,从活动监视器里记下目标进程的 PID。然后打开终端,输入命令 lsof -p [PID] | grep -E 'REG|DIR'(记得把 [PID] 换成实际的数字)。在输出结果里,你需要重点关注 TYPE 列为 REG(常规文件)的那些条目。如果某个文件的 SIZE 或 OFFSET 数值在持续增长,那它很可能就是正在被频繁读写的“活跃分子”。尤其要注意路径中包含 Library/Caches、Logs、~/Downloads 或类似 node_modules 这类目录的文件,它们往往是Mac磁盘高I/O的“重灾区”。
三、使用fs_usage实时追踪指定进程的文件系统调用
如果静态列表还不够,想要亲眼看看这个进程是如何“蹂躏”磁盘的,那就得请出 fs_usage 这个高级工具了。它能以纳秒级的精度,实时显示文件系统的每一次调用,比如打开、读取、写入、关闭,并且附带上文件路径和操作耗时,信息非常详尽。
在终端中执行 sudo fs_usage -f filesys -w -t -p [PID](需要输入管理员密码),等待几秒钟,屏幕上就会开始滚动输出。留意那些以 write_nocancel、read_nocancel 开头的行,每行末尾显示的就是被操作的文件具体路径。通过这个动态视图,你可以清晰判断进程是在顺序读取一个大文件,还是在随机写入大量小文件。记得用 Control+C 及时结束追踪,避免给系统带来额外负担。
四、借助dtrace脚本识别高延迟单次I/O操作涉及的文件
有时候,平均磁盘吞吐量看起来不高,但系统却会间歇性卡顿,这通常是某些单次I/O操作延迟极高导致的。要揪出这些“罪魁祸首”,我们可以使用更底层的 DTrace 工具。这个方法稍微复杂一些,需要先确保安装了 Xcode 命令行工具(可通过 xcode-select --install 安装)。
其核心思路是,设置一个延迟阈值(比如100毫秒),专门捕获那些超过阈值的慢速读写操作。你可以运行一个特定的 DTrace 脚本来监控。当脚本运行时,尝试去触发那些让你感到卡顿的操作(比如打开一个巨型设计文件)。脚本会输出文件描述符(FD)和对应的操作延迟。之后,再结合 lsof -F f -p [PID] 命令,就能将高延迟的文件描述符匹配到具体的文件路径上,从而精准定位问题文件。
五、检查Time Machine本地快照与APFS快照占用
如果以上方法排查了用户进程都没发现明显问题,那么视线就该转向系统本身了。macOS 的 Time Machine 本地备份和 APFS 文件系统的快照功能,虽然默默无闻,但它们的创建、合并和清理过程,可能会在后台引发大量的元数据更新和磁盘块复制操作,从而导致间歇性的高I/O。
可以通过两个命令来检查:运行 tmutil listlocalsnapshots / 可以查看本地快照列表;执行 diskutil apfs listSnapshots "Macintosh HD"(请将卷名替换为你自己的)可以查看 APFS 快照的详情。如果发现快照数量异常多(例如超过20个),且创建时间非常密集,那么它们就很可能是导致磁盘繁忙的“幕后黑手”。为了验证,可以临时禁用本地快照(命令:sudo tmutil disablelocal),然后观察活动监视器中 backupd 和 mds 等进程的磁盘写入活动是否显著下降。如果下降了,问题根源也就找到了。

