LanYunのBlog

LanYunのBlog

马上订阅 LanYunのBlog RSS 更新: https://lanyundev.com/atom.xml

macOS关闭虚拟内存

2021年12月10日 17:34

前言

macOS关闭虚拟内存(交换内存 swap memory) 以减少SSD磨损,延长SSD寿命(本文含macOS硬盘写入量查询方法)

关闭后效果:

image-20231108203249083

由于macOS特性,即使你按照本文操作了,依然可能使用swap,但比之前更少.

Mac OS X / IOS 内存管理机制

OS X的内存管理与Unix是很类似的,内存管理的思想都是尽可能的使用内存,内存是计算机最宝贵的资源,读写速度快过硬盘

例如: 看上面效果图,你可能会觉得我的64G内存系统应用就用掉10G以上,这不是大大的浪费吗?

实际上,这个是很正常的,为什么呢?

在OS X中内存分为这几种状态:

  • active
  • inactive
  • free
  • wired

wired
代表联动内存,这是系统核心占用的,无法移动到硬盘,必须保留在RAM里,联动内存大小取决于当前应用程序。

active
代表当前正被使用或刚被使用过的内存

inactive
表示这些内存中的数据是非活跃的,现在没有在使用,但是最近刚被使用过。比如刚刚关闭了一个Mail应用,它的内存并不会立刻被释放掉,而是变为Inactive,这样当我们再次打开它时,就可以快速打开,而不需要从比较慢的硬盘再打开。而在没有再次打开Mail前,启动其他应用是可以用这块inactive的内存的,它就像可用内存一样,可供其他应用程序使用,但是可以在其他应用程序占用它前,使得打开Mail更快。

free
没有使用的内存

例如我的64G内存

image-20231108203341156

事实上,使用OS X/linux等类Unix操作系统时,是不需要担心内存占用太多的,因为内存就是要充分使用的。
当你有少量free内存,大量inactive内存时,表明此时系统运行在最佳状态,反而在刚开机时大量free时会比较慢。
只有当free和inactive都很少时才说明内存不够用了。但事实上,得益于SSD和M1 MAX的强大,即使CPU压缩内存到硬盘,再从硬盘取回数据,这之间的时间间隔也非常小,用户几乎很难察觉出来,所以MAC用户无需担心内存使用问题.

我尝试过将CPU和内存拉满,但即使这样,系统UI也没出现明显卡顿.

得益于OS X 系统采用了 Unified Buffer Cache,MAC的空闲内存会被用来加速文件访问.即上图中的压缩内存.

在日常使用中,可以做到随时开随用,流畅无卡顿.

了解更多,请参考🔗

为什么要关闭?

img

我们都知道,SSD写入有容量限制,一旦写入达到了设计的最大写入容量,这SSD也就报废了,

例如 512G 的 SSD 寿命一般 300T,写入量(一礼拜2T)就算刻意每天都很注意的用 2-3年你固态也写满报废了

然而还不能自己换,高度集成化,固态坏了就要全套板子一起换

256g固态的理论寿命是150TBW,一个月10T写入的话

理论来讲你只能用一年零三个月,实际情况永远是主控先挂 全盘GG

1.启动虚拟内存(默认):无论怎么样都会使用虚拟内存,除非你的内存特别大,目的是为了防止在突然打开一个超大的文件时,导致需要重新处理内存与虚拟内存。所以默认使用虚拟内存,尽量让出大部分物理内存。

2.关闭虚拟内存(需要手动):默认不使用虚拟内存,但经过我观察,似乎是超过预警阈值(内存GB-2GB的样子)就会开始使用虚拟内存,我猜测目的是为了系统的稳定性

SSD损耗科普链接🔗

如何关闭虚拟内存?

  1. 关闭系统完整性保护机制

  2. 关闭虚拟内存

首先关闭系统完整性保护需要进入recovery OS,Apple芯片进入模式与intel不同.

在电脑完全关机的情况下,一直按着电源键不放,直到提示你正在进入启动选项就可以放手了.之后点选项,选择用户,输入密码后

左上角有一排的菜单,找到终端打开它,输入:

1
2
csrutil disable # 关闭sip,开启则为enable
# 如果不想完全关闭SIP,可选择关闭部分SIP的方法来实现(新版系统可能会失效,其自行验证是否生效): csrutil enable --without nvram

输入yes,之后密码,然后reboot重启.

重启电脑后打开终端,输入:

sysctl -a vm.compressor_mode 来检查现在的内存模式,默认为 4

  • 1 代表不压缩内存且不启用 swap
  • 2 代表压缩内存但不启用 swap
  • 3 代表不压缩内存但启动 swap
  • 4 代表着压缩内存并启用 swap

运行命令

1
2
3
sudo nvram boot-args="vm_compressor=2 $(nvram boot-args 2>/dev/null | cut -f 2-)" # 这条命令作用是将vm_compressor=2插入到nvram boot-args参数中,如果已存在,那么请修改参数,而不是插入.
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist >/dev/null 2>&1
sudo rm -rf /private/var/vm/swapfile*

使用指令sysctl -a vm.swapusage可以查看虚拟内存使用情况.

重启, 检查swap是否已关闭.

1
sysctl -a vm.compressor_mode

如何查询Mac硬盘写入量

查看硬盘写入量是通过一个叫 smartctl 的应用实现的

安装 HomeBrew

通过 Mac os 上的软件包管理工具 HomeBrew 来进行安装 (若已安装则跳过即可)

官网给出的方法十分简单,只需要在终端中粘贴如下代码即可:

1
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)

若出现

1
raw.githubusercontent.com port 443: Connection refused

则说明终端没有过代理(需科学上网)

简单的方法就是换源,终端输入以下代码即可:

1
2
3
4
# 设置homebrew-core镜像
HOMEBREW_CORE_GIT_REMOTE=https://mirrors.ustc.edu.cn/homebrew-core.git

/bin/bash -c "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install.sh)"

等待安装完成后,需要设置环境变量,在终端中接着输入以下代码即可:

注意:如果你确定使用的终端是zsh(一般默认是zsh),那么直接执行下面代码,否则请将两段的末尾的 zshrc 改为bashrc即可

1
2
echo export PATH=/opt/homebrew/bin:$PATH >>...

剩余内容已隐藏

查看完整文章以阅读更多