[IT杂谈] 简单说说关于M1的mac硬盘读写量巨大的问题和症结

Rual-avatar

Rual

2021-04-22T12:12:25+00:00

以下内容可能比较硬核,已经尽量让普通人能看懂了,如果还是看不懂可以直接拉到最下面看结论。

说白了,macOS的SSD海量读写来自于操作系统虚拟内存的Swap(交换)

目前主流的操作系统,都会把CPU的缓存(Cache),物理内存(RAM),持久性存储设备(HDD或SSD)这些当成一块平坦的,统一的储存空间。
这样的好处是,当某一层级的物理空间不足时,也可以同时运行多个进程。
举个例子,理想状态下,不考虑操作系统和其它进程等因素,某个进程所需的空间为60MB,以Zen2处理器举例,L1缓存为512KB,剩余的59.5MB数据往下一层级堆放,L2缓存为4MB,L3缓存为32MB,CPU缓存共计放了36.5MB,而剩下的23.5MB则放到了RAM中。使这个进程可以正常运行。
而当这个进程所需的空间超过20GB了怎么办?CPU的Cache和惨兮兮的16G的RAM都已经装不下了,这时就会把这个进程的部分数据往持久性存储设备,也就是硬盘里放。这时,这个进程虽然可以运行,但效率极低,因为他在运行的时候要受到速度极慢的硬盘限制。这时就是常说的”爆内存“。
在macOS中,出现这种现象时,会专门在APFS中单独分出来一个VM分区来存放这些数据,这部分硬盘就是所谓的”虚拟内存“。当然如果连这个VM分区都占满了,macOS会直接弹出一个通知框告诉你内存用尽,建议用户手动关掉一些进程来释放内存。
这就是为什么很多人觉得macOS的内存管理似乎很好的原因,即便进程所需内存已经远远超出实际的物理内存了,但电脑依然能正常运行,而不像早年的Windows直接报错蓝屏死机。而且近年来的苹果电脑的SSD速度都比较快,对使用体验影响都算比较小。

说回给进程分配空间那里,在操作系统给进程分配地址空间时,会将空间切割成很多小块,这里,x86为4KB,ARM为16KB。
每个块,叫做一个页(Page),无论什么进程,操作系统给他分配空间时都会这样处理。
当所需的页超过实际物理内存了怎么办?macOS会首先考虑压缩内存,就像rar一样,等到使用这些数据的时候,再把它拉出来解压缩,这需要耗费CPU算力,所以这时进程的响应速度会略微变慢一些。
而当压缩也不能解决问题时,操作系统就要面临一个选择,将这个进程抛弃,还是随便找个地方把它先放起来。
如果这个进程的页自从进入内存就没修改过,也没被访问过,那么操作系统就会果断将其删除抛弃来获取空闲内存。
但是实际使用过程中这样的进程非常少,现代的软件在开启的一瞬间就会干一大堆事情,比如读取硬盘数据,连接网络等等。这种现象在macOS会更加严重,因为苹果相关的关联服务进程非常多。
如果这个页进入内存后被修改过,那么一般称这种页叫做”脏页“,这些是不会自动释放的。
如果内存中脏页非常多,多到即便释放了空闲内存,物理内存依然不够用,就必须要找个地方把它放起来,最优先的位置自然是持久性存储设备中,也就是硬盘里。
如果这些进程持续保持活跃,操作系统只能不断地将之前写入硬盘的数据读回来,这种操作会随着空间越来越紧张变得越来越密集,这时操作系统就会进入一种叫做Thrashing(颠簸)的状态。
此时,CPU的吞吐量反而会大幅下降,因为前面的Cache和RAM都要等待缓慢的硬盘返回或写入数据,同时IO也会被沾满(因为要不停的读写硬盘),即便不再增加进程磁盘占用量也会越来越大(因为CPU效率的降低,脏页会越攒越多)在这时,就可以在系统中看到疯狂的硬盘读写操作,这就是所谓的Swap in and out。

这时,因为ARM的"页"要比x86的大,所以ARM出现“近期出现过读写”的脏页的概率天生就要比x86的高好几倍。这也是为什么这个问题从M1面世后才出现在公众视野里。
如果要消除Thrashing状态,最好的办法就是增加物理内存,或者强制干掉一些活跃进程。
在手机设备中,无论是安卓还是iOS,因为手机操作系统的特殊性,都用不着使用Swap技术,直接杀后台就完事了。所以如果担心M1mac的SSD大量读写问题会影响到你这个月底买的新iPad Pro,你大可放心,这问题与你无关。
但是macOS不行,电脑操作系统杀后台成何体统?那怎么办?那还能怎么办?顶多就是弹个窗让用户手动关掉几个进程呗。[s:ac:衰]
不信的话,你们也可以找个高通的设备装个ARM版的Linux,运行几个高负载的软件试一试,该爆内存还是爆,硬盘照样疯狂Swap,这事macOS只能背一半锅。
剩下的一半锅?只能说苹果系统架构工程师学艺不精,看看人家Windows的内存管理[s:ac:赞同]说一句巨硬牛逼没人会有意见吧。

另外提一嘴,ARM版的macOS本身的进程调度也有问题,同样的APP,同样的负载,M1的内存占用量就是比Intel的高,原因未知。
而且空闲内存释放逻辑也有问题,有些进程我都已经手动关掉了他也不会释放内存。[s:ac:无语]
这事我猜有两种可能的原因,以下为猜测,不一定准,可以看个乐:
1:ARM的macOS在写进程调度的时候模仿了iOS的逻辑,但是iOS是会自动杀后台的,macOS不会,而他们的工程师没有考虑到这点。
2:ARM的macOS在写进程调度的时候依旧沿用了Intel的逻辑,设计了五层缓存,也就是L1,L2,L3,RAM,SSD,但M1在硬件设计上就没有L3,于是系统把M1的第三层级存储空间,也就是RAM当成了L3来使用。而L3缓存本来就不会自动释放空间,而是当有了新数据送来需要处理时才会释放。


说白了,这事和硬件架构和软件工程师水平都有关系,锅各分一半吧。
硬件部分受制于ARM架构天生的属性,改不了的。
软件部分,众所周知,macOS的上古底层代码是真正的屎山,我曾经在M1的macOS里面找到过一个2001年的Intel百兆网卡驱动程序……早年的macOS都是把一部分驱动直接写进系统内的。这么多年,这些陈年代码他们从来都不清理的。但这并不代表这事不能解决,只是很麻烦罢了。
只能等后续更新了,问题严重了苹果应该会修的(吧?)[s:ac:衰]
要是不修的话,等过两年总有倒霉蛋硬盘寿命到了开始闹[s:ac:哭笑]到时候肯定有延保政策,甚至可以免费换新,岂不是更爽?

另外,可以用我的偏方手动清理内存[s:ac:哭笑]
用Parallels Desktop虚拟机软件打开任意一个虚拟机系统,然后在设置中勾选[在关机时回收磁盘空间],然后关掉虚拟机,因为这软件会在关掉虚拟机的时候强制重启苹果的那堆服务进程,内存一下子就释放出来了。
详情可见:[url]https://nga.178.com/read.php?tid=26462646[/url]

其实,SSD写坏了这种事根本没必要闹心,它坏不坏本来就是个很玄学的事情,有时候刚买回来莫名其妙就坏了,有时候读写量都超过标称七八倍了都没事。
电脑本来就是生产工具,该用就用,用的时候就别考虑他坏了会怎么办。他买回来就是拿来用的,而不是当块宝捧着的。
Rual-avatar

Rual

[s:a2:不活了]经典费劲码字没人看,我好惨
Best-avatar

Best

厉害,学习了
AbstrakT_Dill-avatar

AbstrakT_Dill

厉害了,学习了,所以说x86还是有不少可取的地方的,并不是说就要就要进历史的垃圾堆了
PapiKuro-avatar

PapiKuro

是大佬[img]http://img.nga.178.com/attachments/mon_201209/14/-47218_5052bc80140e3.png[/img]
chumguzzla-avatar

chumguzzla

点个赞。
但是mac这事其实主要是和mac的一体化设计有关系,因为新mac的全板载一体化设计导致一旦真的发生因为硬盘读写量导致的鼓掌会让m1mac顺便变成真正意义上的电子垃圾。而不是传统pc或者服务器工作站那种硬盘费了换硬盘就可以解决的问题。
Combine-avatar

Combine

用了一个多月,还没查我的读写量,我16g的先收藏[img]http://img.nga.178.com/attachments/mon_201209/14/-47218_5052bc4cc6331.png[/img]有空查查
Snooty-avatar

Snooty

就是bugOS的问题
Mrbuttslap-avatar

Mrbuttslap

学到知识了!
LucioRage-avatar

LucioRage

不用太在意这个东西,有的人的ssd经常断电几次就坏盘了,不同牌子都这样,我都怀疑是玄学了...

而我家的一块80g的ssd,11年买的都还好好的..
Meem sos-avatar

Meem sos

[img]http://img.nga.178.com/attachments/mon_201209/14/-47218_5052bc4cc6331.png[/img]看着疯狂写固态总归还是有些不爽的
客观上也确实降低了使用寿命
Kiitty-avatar

Kiitty

等m2出来能选32gb我就选[s:ac:哭笑]
Slaughter-avatar

Slaughter

是大佬!
讲的很简单易懂 学习了!
Exho-avatar

Exho

[quote][pid=510611551,26465997,1]Reply[/pid] Post by [uid=39995643]日耳曼尼亚帝国皇帝[/uid] (2021-04-24 20:44):

点个赞。
但是mac这事其实主要是和mac的一体化设计有关系,因为新mac的全板载一体化设计导致一旦真的发生因为硬盘读写量导致的鼓掌会让m1mac顺便变成真正意义上的电子垃圾。而不是传统pc或者服务器工作站那种硬盘费了换硬盘就可以解决的问题。[/quote]这个我觉得不用太担心 华侨城的焊工厉害的……而且苹果好像也没有锁这个硬盘 所以以后换硬盘服务肯定有……就是价格比以前那种可以自己换的贵多了
chumguzzla-avatar

chumguzzla

[quote][pid=510615033,26465997,1]Reply[/pid] Post by [uid=5437536]qq445700860[/uid] (2021-04-24 20:56):

这个我觉得不用太担心 华侨城的焊工厉害的……而且苹果好像也没有锁这个硬盘 所以以后换硬盘服务肯定有……就是价格比以前那种可以自己换的贵多了[/quote]然而这方面的我记得不行,除了板载设计本身以外还涉及到加密芯片的硬件识别。
mac一直在堵用户自行升级硬件路。
SteadyEddyV1-avatar

SteadyEddyV1

支持一下,在v2ex看过说beta版本修复了这个bug,我自己是入手后第一时间就更新到 beta6,而且是轻度使用所以看不出到底有没有真的修复了
WAV🌊-avatar

WAV🌊

楼主好厉害,虽然看不懂,技术帖还是佩服。
Kendriesh-avatar

Kendriesh

学习了,我m1首发买的,上次出这问题时查一下写入4t了,看看以后会不会延保或者换新[img]http://img.nga.178.com/attachments/mon_201209/14/-47218_5052bcb093870.png[/img]
Deo-avatar

Deo

之前chh也有人说这个,好奇有多少个体是比较倒霉遇到提前ssd坏的…
Nick123-avatar

Nick123

就是说这一代没有办法解决,硬件本身也是有锅的,当然系统的锅更多一些