磁盘i/o卡顿表现为系统响应迟滞、命令执行卡顿、进程状态为d、iostat中await高及%util接近100%,主因包括硬件故障、系统配置不当、应用层压力及资源过载。

如果您在使用Mac时发现系统响应迟滞、风扇持续高转或磁盘指示灯频繁闪烁,则可能是某些文件或进程正在引发高强度磁盘I/O行为。活动监视器无法直接显示“哪些文件”被读写,但可通过识别高I/O进程并结合其访问路径、打开文件列表与实时行为模式,定位实际占用磁盘IO的文件来源。以下是实现该目标的多种可行方法:
一、使用活动监视器定位高磁盘I/O进程
该方法基于系统原生工具,通过排序与动态观测识别当前消耗最多磁盘带宽的进程,是快速锁定问题源头的第一步。活动监视器虽不显示具体文件路径,但可提供进程名、PID、实时读写速率及累计I/O量,为后续深入分析提供关键线索。
1、按Command + Space打开聚焦搜索,输入活动监视器并回车启动;
2、点击顶部标签栏中的磁盘;
3、右键表头区域 → 勾选读取字节/秒和写入字节/秒(若未默认显示);
4、点击写入字节/秒列标题进行降序排列,观察顶部进程;
5、对疑似目标进程(如mdworker、backupd、GoogleSoftwareUpdate、Docker Desktop),右键选择在Finder中显示,确认其可执行文件位置与签名有效性。
二、通过lsof命令查看进程打开的文件列表
该方法利用终端指令获取指定进程当前打开的所有文件句柄,包括正在读写的普通文件、日志、缓存数据库及内存映射文件,是将高I/O进程与具体文件建立直接关联的核心手段。需配合活动监视器中获取的PID使用。
1、在活动监视器“磁盘”页记下目标进程的PID(进程ID);
2、打开终端应用,输入命令:lsof -p [PID] | grep -E 'REG|DIR'(将[PID]替换为实际数字);
3、观察输出中TYPE列为REG(常规文件)且SIZE或OFFSET持续增长的条目,这些即为当前被高频读写的活跃文件;
4、重点关注路径含Library/Caches、Logs、Containers、.git、node_modules、~/Downloads等高I/O风险目录的文件行。
三、使用fs_usage实时追踪指定进程的文件系统调用
该方法提供纳秒级精度的实时文件操作流,可精确捕获每一次open、read、write、close系统调用及其对应文件路径、字节数与耗时,适用于需要确认某进程是否正对特定大文件执行顺序读取或随机写入的场景。
1、在终端中执行:sudo fs_usage -f filesys -w -t -p [PID](需输入管理员密码);
2、等待约5–10秒,观察输出中write_nocancel、read_nocancel、pwrite_nocancel等I/O类调用行;
3、每行末尾显示的路径即为当前被操作的文件,例如/Users/xxx/Library/Application Support/Code/Cache/xxxx;
4、按Control+C中断追踪,避免长时间运行影响系统性能。
四、借助dtrace脚本识别高延迟单次I/O操作涉及的文件
该方法针对“磁盘卡顿感明显但平均吞吐不高”的典型症状,通过检测单次I/O延迟超过阈值(如100ms)的操作,定位引发界面冻结或应用无响应的具体文件。需启用开发者模式并安装Xcode命令行工具。
1、确保已安装Xcode命令行工具:xcode-select --install;
2、执行以下dtrace脚本(复制粘贴至终端):sudo dtrace -n 'syscall::write:entry,syscall::read:entry { self->start = timestamp; self->fd = arg0; } syscall::write:return,syscall::read:return /self->start/ { @latency = avg(timestamp - self->start); @file = quantize(arg1); printf("FD %d, latency %d ns\n", self->fd, timestamp - self->start); self->start = 0; }';
3、运行期间触发疑似卡顿操作(如打开大型PDF、导入视频项目);
4、观察输出中latency值持续高于100000000(100ms)的记录,结合后续lsof -F f -p [PID]匹配文件描述符(FD)与路径。
五、检查Time Machine本地快照与APFS快照占用
该方法用于排除系统级自动机制导致的隐性高I/O,特别是当用户未主动执行备份但仍观察到backupd或mds进程持续高写入时。本地快照虽不显示为普通文件,但其创建、合并与清理过程会引发大量元数据更新与块复制操作。
1、在终端中运行:tmutil listlocalsnapshots /,查看是否存在大量时间密集型快照;
2、执行:diskutil apfs listSnapshots "Macintosh HD"(请将卷名替换为实际名称),确认快照数量与大小;
3、若快照数异常多(如>20个)且最近创建时间密集,可临时禁用本地快照以验证影响:sudo tmutil disablelocal;
4、观察活动监视器中backupd与mds进程的写入字节/秒是否显著回落,若回落则说明快照维护是主要I/O来源。











