ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

M1 Mac 关闭虚拟内存可行吗?swap、SSD 写入与替代方案

M1 Mac 关闭虚拟内存可行吗?swap、SSD 写入与替代方案 前阵子有位做 iOS 的朋友把他的 M1 MacBook Air 递给我说机器最近老卡怀疑是交换内存写太多把 SSD 拖垮了想让我帮忙把 swap memory 关掉。我当时没急着动手先让他打开活动监视器看了一眼内存压力——绿色交换使用量 0 字节。真正的问题是他同时开了三个模拟器加 Xcode 索引纯粹是内存不够用。这件事挺典型的**Mac M1 关闭虚拟内存**这个说法在网上传了好几年信的人不少真正搞清楚背后机制的人不多。我把这几年在 M1、M2、M3 机器上折腾的记录加上当时那场 SSD 写入量风波的来龙去脉整理一下尽量把话说透。这篇内容想解决三件事一是把 swap memory 在 Apple Silicon 上的真实工作机制讲清楚二是说明关闭 swap 在 M1 上到底可不可行、代价是什么三是给出几条比关闭 swap更值得做的替代方案——顺带把 Windows 的虚拟内存设置和 Linux/Debian 的 swapoff 也一并理顺因为很多人是在多系统环境里被同一个问题困住的。手里有 M 系列 Mac、对 SSD 寿命有焦虑的装了虚拟机发现宿主机磁盘写入爆炸的或者单纯想搞明白虚拟内存设置多少才合理的都能从下面找到能直接抄的答案。1. 关掉 Mac M1 的 swap这个建议是怎么冒出来的1.1 2021 年那场 SSD 写入量风波2021 年初海外社区上出现了一批帖子用户用第三方工具读取 M1 Mac 的 SSD 健康数据发现自己的机器在几个月内写入了 20TB 甚至 30TB 以上的数据256GB 容量的机器看起来很快就写满寿命了。帖子越传越广M1 会把 SSD 写废的说法就此成型而罪魁祸首被指向 swap——因为大家发现只要内存压力上去macOS 就会不停地在 SSD 上创建和读写 swapfile。事情的转折点在于几位存储方向的开发者出来做了澄清。核心结论是苹果在 Apple Silicon 上用的存储控制器和固件接口并不完全遵循标准 NVMe 规范SMART 日志里那几个字段的含义和标准定义存在差异第三方工具按标准规范去解读时很容易把写入量的数值算大。也就是说你看到的20TB未必真的等于 20TB 的 NAND 实际写入。这不代表 swap 写入不存在而是说当年那批用来制造恐慌的数字本身就打了折扣。我个人的看法是那场风波里因为 swap 导致 SSD 早衰这个因果链条被过度简化了。真正值得关注的不是绝对写入量而是写入量的增长趋势和内存压力长期处于什么状态。一台长期黄色内存压力的 8GB M1确实会产生持续的后台写入但这跟必须关闭 swap 才能保命是两回事。1.2 swap 在 Apple Silicon 上具体扮演什么角色要理解这个建议先得知道 swap 在 M1 上是怎么工作的。Apple Silicon 用的是统一内存架构CPU、GPU、神经引擎共享同一块物理内存没有独立的显存。当活跃应用申请的内存超过物理内存容量时macOS 会按两个层次去处理第一步是内存压缩把不活跃的内存页压扁后仍然留在内存里第二步才是把压缩后还是放不下的页面写到 SSD 上这一步就是 swap。macOS 的 swap 是加密的执行sysctl vm.swapusage时输出末尾那个(encrypted)就是提示。swapfile 存放在数据卷的/System/Volumes/Data/private/var/vm/目录下系统会按需动态创建多个文件单个文件通常是 1GB 或者 2GB 起步容量不够就继续加。这跟 Intel Mac 时代的机制在原理上一致差别在于 Apple Silicon 的 SSD 读写延迟极低换出换入的代价相对更小所以系统在内存吃紧时会更愿意往 SSD 上放东西。这里有个很多人忽略的点Apple Silicon 的物理内存页大小是 16KBIntel Mac 是 4KB。这个差异会直接影响你读vm_stat时的换算结果后面讲查看方法时会具体说。1.3 内存压缩和 swap 是两码事别混为一谈论坛上经常看到有人问怎么关闭内存压缩把压缩和 swap 当成同一个东西。实际上 macOS 在 10.9 就引入了内存压缩机制而压缩发生在内存内部不产生磁盘写入。真正产生 SSD 写入的是 swap。关闭 swap 不会关闭压缩压缩该跑还是跑。这个区别很重要因为很多人想减少磁盘写入结果一通操作把压缩也关掉了反而让内存压力更容易飙到需要 swap 的程度写入量不降反升。正确的思路是压缩是朋友swap 是最后的安全网你要做的是别让系统走到需要安全网的那一步而不是把安全网拆了。2. 先学会看数据M1 上 swap 到底用了多少2.1 三条命令看清 swap 与内存压力在动手之前先搞清楚自己机器上到底是什么状况。macOS 自带三条够用的命令不需要装任何第三方工具。第一条看 swap 总量和用量sysctl vm.swapusage输出形如vm.swapusage: total 4096.00M used 1024.00M free 3072.00M (encrypted)。used是当前被换出的数据量total是总共已经分配的 swap 空间。注意total会随着使用动态增长不是固定的。第二条看系统级的整体判断memory_pressure它会打印一堆分页统计最后一行给出System-wide memory free percentage这个是当前系统可用内存的百分比比单纯看 swap 用量更能说明问题。第三条看逐页明细vm_stat输出第一行会写明Mach Virtual Memory Statistics: (page size of 16384 bytes)这就是前面提到的 16KB 页大小。里面几个字段值得盯Pages free是空闲页Pages occupied by compressor是压缩器占用的内存Swapins和Swapouts是换入换出的页数。换算出实际字节数时记得乘 16384不要按 4096 算否则数字会小四倍。2.2 活动监视器里那几个数字怎么读不想敲命令的话活动监视器的内存标签页其实信息量更大关键是要看对地方。最容易误导人的是已用内存这个数因为 macOS 会把大量文件缓存也算进去看起来永远很高。真正要看的是底部的内存压力图表绿色说明内存够用黄色说明系统开始用压缩和 swap 顶着了红色说明已经到极限、系统在拼命换页。另外两个数也很直观——已压缩是压缩器省下来的内存量交换使用量是当前写到 SSD 上的数据量。内存压力绿色 交换使用量接近 0什么都不用做SSD 写入主要来自正常文件操作。内存压力黄色 交换使用量几百 MB偶尔出现很正常持续出现要留意。内存压力红色 交换使用量几个 GB这才是真正需要处理的状态。2.3 判断我该不该动它的简单标准我把实际遇到的几种情况整理成一张表你可以直接对号入座观察到的状态大概率原因建议动作压力绿交换 0内存充足不用管关 swap 纯属折腾压力黄交换 1GB偶发打开大项目、剪辑时短暂高峰不用管是正常保护机制压力黄交换持续 2GB常驻程序太多或单个程序吃内存优化后台见第 4 章压力红交换 4GB物理内存物理层面不够减负载或考虑换机压力绿但每天写入几十 GB通常是虚拟机或索引服务查虚拟机内部配置这张表的逻辑很简单swap 本身不是病是症状。把它关掉只是把温度计砸了烧还在那里。3. 关闭 swap 的实操路径与其真实可行性3.1 Intel Mac 时代的老方法附恢复步骤网上流传最广的那套操作其实是 Intel Mac 时代的产物在 Catalina 及更早的系统上确实能用# 停止动态分页器 sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist # 删除已有 swapfile sudo rm -f /private/var/vm/swapfile*执行完之后sysctl vm.swapusage会显示 total 为 0。想恢复的话sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist注意在 Big Sur 及之后的系统上这条launchctl unload命令多数情况下会直接报错说找不到对应服务因为它依赖的那个 plist 已经不再是可卸载的形式了。也就是说这套方法在 M1 上基本是失效的。3.2 Apple Silicon 上这条路为什么走不通Apple Silicon 上的障碍比 Intel 机器多好几层。第一层是系统卷签名机制。从 Big Sur 开始macOS 的系统卷是只读的签名快照任何对/System路径下的改动都需要先关闭系统完整性保护重启进恢复模式执行csrutil disable。这一步本身就降低了整机的安全基线。第二层是分页器管理方式变了。Apple Silicon 上的 swap 由内核直接管理不再暴露一个可以简单 unload 的用户态守护进程。社区里流传过改/System/Volumes/Data/private/var/vm目录权限、改挂载属性的做法反馈差异很大——有人在某个系统版本上短暂生效过有人压根没反应而且几乎所有人都在下一次系统更新后发现设置被还原了。第三层是即便你关掉了后果也未必是你想要的。macOS 的内存管理是宁可换页也不杀进程的保守策略一旦 swap 被强制关闭内存耗尽时系统只能直接终止应用进程严重时会出现整个系统无响应甚至内核崩溃。你为了保 SSD 换来的是随时丢工作进度的风险这笔账怎么算都不划算。我的结论很明确在 Apple Silicon 上我找不到一个既稳定、又安全、还能扛住系统更新的关闭 swap 的方法。任何需要关 SIP、改系统卷的方案我都不建议在主力机上尝试。3.3 如果你真的想试风险清单先过一遍如果你就是好奇想验证下面这张表可以帮你评估代价操作主要风险可逆性是否推荐unload dynamic_pager内存耗尽时应用被强杀高重新 load 即可仅 Intel 老系统可试rm swapfile系统可能在压力下立即重建高可以试但意义不大关闭 SIP系统安全性下降部分软件异常中可重新开启不推荐修改系统卷目录权限系统更新后失效可能引发异常低不推荐改 nvram 引导参数可能影响系统启动参数未必生效低不推荐提示关闭系统完整性保护之后务必记得回去重新打开。长期关闭会让一些依赖签名校验的功能出问题而且这个状态本身就是一个安全隐患。4. 比起关 swap这几件事更值得做4.1 从源头把内存压力降下来既然 swap 是内存压力的结果那就从结果往回推。第一步是找出真正的内存大户这条命令按内存占用百分比排序取前 20 个ps aux | sort -nrk 4 | head -20实测下来M1 上最常见的几个吃内存大户依次是浏览器尤其是标签页开二三十个的时候、各类 Electron 应用聊天工具、笔记工具、编辑器都算、Xcode 的索引进程、照片图库的后台分析、以及 Docker Desktop 的虚拟机。这里面的关键是识别出我关了也不影响工作的那几个。具体能做的不多但有效把不用的浏览器标签用休眠类扩展挂起、把常驻聊天工具在不需要时退出、关掉登录项里那些开机自启但其实一周用一次的软件。系统设置里的通用 - 登录项能看全部我见过不少人机器上挂着十几个自启项。另一个容易被忽略的是 Spotlight 索引。刚导入大量素材或者刚克隆完一个巨型仓库的时候mds_stores会疯狂工作这段时间内存和磁盘压力都会上去。这不是病等它跑完就好。实在不想等可以在系统设置里把不常搜索的目录排除掉。4.2 虚拟机内部的 swap 才是真正该关的这一点我要重点讲因为很多 M 系列 Mac 用户看到的高磁盘写入来源其实是虚拟机内部的交换分区而不是 macOS 自己的 swap。虚拟机跑起来之后客户机操作系统有自己的内存管理它认为自己的物理内存就是虚拟机配置分配的那块一旦不够就会往虚拟磁盘里写 swap。对宿主机来说这就是实实在在的磁盘写入而且虚拟磁盘通常是一个大文件写入放大更明显。Linux 客户机包括 Debian 系的处理方式# 先看当前状态 swapon --show free -h # 临时关闭所有交换分区 sudo swapoff -a # 永久关闭编辑 /etc/fstab把 swap 那一行注释掉 sudo sed -i.bak /[[:space:]]swap[[:space:]]/s/^/#/ /etc/fstab改完之后重启验证一下swapon --show是不是空的。如果是用 swapfile 而不是分区的记得 swapoff 之后再手动删掉文件否则它只是不被挂载、空间还占着。Windows 客户机的处理方式图形界面路径是系统属性 - 高级 - 性能设置 - 高级 - 虚拟内存 - 更改选中盘符后选无分页文件。命令行方式# 关闭自动管理 wmic computersystem where name%computername% set AutomaticManagedPagefileFalse # 设置为一个很小的固定值保留应急能力 wmic pagefileset where nameC:\\pagefile.sys set InitialSize512,MaximumSize1024注意Windows 上完全不设分页文件是有代价的某些程序会申请大块保留内存没有分页文件支撑可能直接启动失败。我一般建议留 512MB 到 1GB 作为兜底而不是彻底设为零。另外wmic在新版 Windows 上已被标记为弃用如果你的系统里找不到这个命令用图形界面操作或者在 PowerShell 里配合性能计数器也完全可以。顺带说一句很多人装完虚拟机发现客户机没网那通常是网络适配器模式选错了把仅主机改成共享网络或者桥接一般就能通和虚拟内存设置没有关系别把两件事混在一起排查。4.3 买机器时的一次性决策Apple Silicon 的内存是焊死的买的时候是多少就是多少。所以关于虚拟内存的所有讨论最优解其实在购买环节就完成了。8GB 的 M1 在轻度使用下够用但只要涉及开发、剪辑、多虚拟机内存压力长期处于黄色几乎是必然的swap 写入也会持续存在。16GB 是我认为的舒适线日常多任务基本不会触发明显换页。如果涉及视频后期、大型项目的容器编排、同时跑两三个虚拟机24GB 起步更稳。我的实际经验是与其花时间研究怎么在 8GB 机器上把 swap 关掉不如把这部分精力换成一次直接买够内存的决策。内存带来的收益是每天都在的而关闭 swap 带来的所谓收益在绝大多数使用场景下小到无法感知。5. 横向看Windows 虚拟内存和 Linux swap 的取舍5.1 Windows 那边怎么查、怎么设、32G 内存设多少Windows 的虚拟内存和 macOS 的 swap 是同一个概念的不同叫法本质都是把物理内存放不下的页面写到磁盘上。查当前状态有三条路任务管理器性能 - 内存页里的已提交数值格式是已用/上限、命令行执行systeminfo看虚拟内存一行、或者用 PowerShellGet-CimInstance Win32_PageFileUsage Get-CimInstance Win32_PageFileSetting设置入口是系统属性 - 高级系统设置 - 性能 - 设置 - 高级 - 虚拟内存 - 更改。默认是系统托管追求省心就保持默认。要手动设的话参考值我整理成表物理内存建议初始/最大值说明8GB2048 / 4096 MB留足余量8G 机器换页频繁16GB2048 / 8192 MB初始小、上限大兼顾空间与弹性32GB1024 / 8192 MB初始值不需要大上限留够64GB 及以上1024 / 4096 MB只有极端场景才会用到关于32G 内存虚拟内存设置多少这个高频问题我的建议是**如果不需要做完整内存转储调试把初始值设在 1GB 到 2GB、上限设在 4GB 到 8GB 就够了不必按物理内存的 1.5 倍那套老公式来。**那套公式来自内存普遍只有 512MB 到 2GB 的年代放到 32GB 机器上就是白白占用几十 GB 磁盘空间。唯一的例外是你需要抓蓝屏时的完整内存转储那 pagefile 必须大于物理内存加一点这种需求一般只在专门的调试机器上才有。还要理解一个概念Windows 的提交限制等于物理内存加上 pagefile 大小。很多程序在启动时会按提交限制去申请虚拟地址空间所以 pagefile 太小虽然物理内存够程序也可能报内存不足。这就是为什么我不建议把 pagefile 设为零。5.2 Windows 的内存压缩要不要关Windows 10 从 1511 版本开始引入了内存压缩任务管理器里那个内存压缩进程就是它。它的作用和 macOS 的压缩器一样把不活跃的页压扁后留在内存里减少对分页文件的依赖。查看状态Get-MMAgent输出里MemoryCompression那一行显示 True 或 False。关闭和开启分别是Disable-MMAgent -mc Enable-MMAgent -mc两个命令都需要管理员权限并且要重启才生效。什么情况下该关我的判断是只有当机器 CPU 非常弱、同时内存又比较充裕的时候关掉压缩可能换回一点响应速度。对于绝大多数现代机器内存压缩是净收益因为它用一点 CPU 换来了明显的磁盘 IO 减少——这跟本文主题想要的减少磁盘写入方向完全一致。所以如果你的目标是保护 SSDWindows 这边应该是确保内存压缩开着而不是关掉。5.3 Linux 与 Debian 系里的 swapoff 与 swappinessLinux 上的操作最透明三条命令看状态free -h swapon --show cat /proc/swaps临时关闭所有交换空间就是sudo swapoff -a。想要永久生效得从/etc/fstab里把 swap 条目注释掉否则下次开机又挂回来了。如果用的是 swapfile 而不是独立分区swapoff 之后还要把文件删掉才算真正释放空间。比关不关更值得调的是vm.swappiness这个内核参数它控制内核有多倾向于把内存页换出去取值 0 到 100默认通常是 60# 查看当前值 cat /proc/sys/vm/swappiness # 临时调整 sudo sysctl vm.swappiness10永久生效的方式是写一个配置文件比如/etc/sysctl.d/99-swap.conf内容一行vm.swappiness10重启后自动应用。把值降到 10 左右能让内核在还有空闲内存时尽量不换页既保留了 swap 作为安全网又减少了不必要的磁盘写入这是我认为比直接swapoff更优雅的做法。关于 Linux 分区大小传统建议是物理内存的两倍这在内存动辄 32GB、64GB 的今天已经没有意义。现在的判断标准是如果你需要用休眠功能swap 必须大于等于物理内存如果不需要休眠2GB 到 8GB 完全够用内存特别大的机器甚至可以不设。服务器场景里设个 2GB 兜底是最常见的做法。6. 常见问题与排查实录6.1 一张速查表把这几年前后遇到的问题归了个类做成表方便对照现象常见原因处理方向mac 磁盘写入量涨得快虚拟机 swap、Spotlight 索引、长期内存压力先查虚拟机内部配置再查压力来源关掉 swap 后应用频繁闪退内存耗尽时系统直接杀进程立即恢复 swap 或减少并发程序设置重启后失效系统更新覆盖、fstab 未改改配置文件而非临时命令Windows 报内存不足但内存没满提交限制受 pagefile 限制适当加大 pagefile 上限Linux swapoff 后重启又回来了fstab 里的条目没注释编辑 /etc/fstab 并保留备份虚拟机客户机没网网络适配器模式选择不当切换到共享网络或桥接模式6.2 几个我实际踩过的坑第一个坑是在系统更新后忘记复查设置。macOS 的大版本更新会重建系统卷快照任何对系统目录的改动都会被还原。这不是 bug是设计如此。所以凡是依赖改系统文件的方案都要在每次更新后重新验证这本身就是个长期负担。第二个坑是把 swap 关了但没关内存压缩——反过来说也见过有人把两者都关了。Apple Silicon 上内存压缩是内核行为没有官方开关网上那些声称能关掉的脚本实际操作的是别的参数改完可能连内存压力统计都变得不可信。我的原则是动系统底层参数之前先问自己我能不能在不动它的前提下解决问题。第三个坑是用第三方工具读取的 SSD 健康数据做决策。前面讲过Apple Silicon 的存储接口不完全遵循标准规范第三方工具读出来的 TBW 数值只能当趋势看不能当绝对值信。判断磁盘是否健康更靠谱的做法是看系统是否出现异常卡顿、写入速度是否明显下降而不是盯着一个可能被误读的数字焦虑。第四个坑是关于虚拟机虚拟磁盘格式的。如果你用的是动态分配的大文件客户机内部的写入会被宿主机的文件系统放大再加上快照文件堆叠实际写入量会比你想象的高不少。定期合并快照、给虚拟磁盘留足空间别让它频繁扩容能明显降低宿主机的写入压力。最后分享一个我自己的习惯每次感觉机器变卡我的第一反应不是去调参数而是先打开活动监视器看内存压力颜色再用ps aux | sort -nrk 4 | head -20看一眼谁在吃内存。十次里面有九次答案都在那 20 行输出里跟 swap 设置一点关系都没有。真正需要干预的场景少之又少而需要干预的时候正确的动作几乎从来不是关掉 swap而是把那个吃 8GB 内存的程序关掉或者下次买机器的时候多加点内存。
返回列表