macOS 11初体验——迄今为止x86上的性能最佳macOS

背景

11月13号,苹果在开完发布会之后,推送了macOS 11的系统更新。在经过了一天多的使用之后,它在性能上给我留下了一个深刻的印象。那就是

内存占用比之前低了一半!

现象

这里没有做精确的测试。我这里是一台16款的macbook Pro, 配置是i5-6360U CPU, 16G内存, 512G存储。运行进程数大概在550 ~ 650之间,线程数在2750 ~ 3100之间。之前普遍内存占用在70% ~ 85%左右,同时交换空间占用在8GB ~ 10GB左右。升级后一切都变的不一样了。内存占用降低到50%~70%之间,但是交换区占用在500MB ~ 2GB之间!

分析

这堪称一个质的飞跃!
但是具体的机制现在还没有办法确认是为什么。查看系统xnu版本号为xnu-7195.50.7,但是访问苹果的xnu开源网站,发现还没有更新上去。所以还不能通过源码的部分去看为什么有这么大的提升。

这里猜测几个方向。

一个是内存压缩。这项技术本身在Linux上已经在应用了,另外在之前的macOS系统也有应用。个人感觉可能这并不是主要的增益方向。

一个是C库的内存策略。同一个应用,我粗略对比了下升级系统前后的Slack内存占用,不管是主进程还是渲染进程,刚启动后,都比之前低了几十兆。并且在经过各种操作,等待一段时间之后,macOS 11下的内存占用没有特别大的变化,但是macOS 10这边还是会有所增大。可能C库那边收到用户调用释放内存之后,在新系统下会更快的释放回给系统。

这里也能解释一个之前在macOS 10之下比较奇怪的现象。就是系统运行时间越长,比如开个几十天,你会发现一直存在的应用它的交换区占用会越来越大,对应的就是你的磁盘空间越来越低。这个现象只有在你彻底结束掉进程后,才能恢复。如果你不处理,它会占用越来越多的交换区,直到你发现系统报磁盘空间低,你不得不重启。

剩下的只能等待源码开放后看看了。

而在其他的方面,简单对比了升级前后Chrome播放B站弹幕较多的视频的CPU占用,视频渲染这边,_windowServer的CPU占用没有特别大的变化。看来这方面在x86下没有做特别大的调整。但是很可能在ARM那边由于统一内存架构的使用,很可能会出现比较大的性能提升。

另外之前一直在用的ESET Cyber SecurityLittle Snitch这两款应用,系统升级到11之后必须升级到最新版本才能正常使用。这里面主要的区别在于,旧版本系统下两款应用都使用了内核扩展的形式来进行磁盘操作及进程创建等动作的监控以及网络数据的过滤。但新系统下,默认苹果基本不会再允许使用内核扩展了,取而代之的是一系列的用户空间的扩展接口,如System ExtensionNetwork Extension。对于这一变化,我能看到的最直观变化就是, kernel_task这个线程组的CPU占用基本上一直处于非常低的水平,平时3%,高的时候不超过10%,比起之前不一定什么时候就飙上去的情况是好了不少。

这里说一说我对用户空间扩展接口的看法。有些人可能觉得这是一种苹果进一步封闭自己的行为。但我们如果从功能实现复杂度和性能的角度来说,这其实是一种不错的架构优化。应用开发者为什么要使用内核扩展,是因为用户空间可以调用的API没有提供相应的功能。我作为一个用户空间的应用程序,如果能在用户空间把想做的事情都能做好,为什么还要冒风险和承担开销去内核空间进行操作呢? 而且这种数据反反复复在内核空间和用户空间穿行的做法,本身也很影响效率。为开发者提供粒度符合大多数业务需求且不会大幅增加复杂度的接口,这本身就是一个很有挑战性的事情。

回顾与展望

macOS 10在2001年刚出来的时候,给我们带来了一个真正意义上的现代操作系统。比如抢占式多任务(线程)替代了协作式多任务(协程),还有进程内存空间替代了全局内存空间。这一架构奠定了接下来近20年应用开发的基础。

macOS 11这个大版本将给我们带来什么? 它自然是要解决现在以及可遇见的几十年会遇到的问题。在当下,我目前能看到这些问题。

更好的多核支持

在这个CPU单核性能提升已经跟不上对算力增长要求的时代,如果把多核支持做好是每一个操作系统都必须面对的问题。现在大小核及众核,还有不共享缓存的核,各种差异的场景还是很多的。把调度做好,是每一个操作系统的必修课。感觉这方面macOS做的不算差的,相比而言做的最烂的算是Linux了。

异构计算的支持

上面说过除了CPU进行控制和运算之外,其实我们现在完成任务时,CPU擅长的线性计算以及逻辑控制,在很多场景下反而不合适。因此擅长并行计算的GPU, 用于神经网络的NPU等等都出现了。操作系统必须有能力调度和分配异构计算资源,让应用可以方便高效的进行使用。这一点macOS应当说也做的不算差,不管是Metal还是Core ML,都及时推出了自己的API,也有自己的高性能硬件,还因为自己掌控全部硬件体系,实现了统一内存架构,降低了内存拷贝产生的开销。

更高信息量的交互

这里说到了面向用户操作系统的独特之处。用户操作系统需要的是把信息从人和环境进行输入,并把信息输出到人和环境中。上一代革命性的提到向人进行信息输出的东西,就是GUI,它比起前代的CLI在数量级上提升了信息输出的效率。这几十年,GUI这个方式从未改变过,从电脑到手机,到平板。关于输入,近年来摄像头,传感器和触屏,让信息输入能力比起键盘鼠标有了呈数量级的提高。而苹果关于信息输出效率的提高,似乎也越来越清晰,就是增强现实(Augmented Reality)。同时AR Kit也越来越走向成熟。它的应用会将信息输出效率再高一个数量级。

那macOS 11会如何解决这些问题,又会给我们带来什么惊喜呢
我们拭目以待

参考

Implementing Drivers, System Extensions, and Kexts
Difference between OS 9 and OS X
WWDC20解析:苹果最伟大的创新, 和最震撼的未来