如果你跟我一样也使用旧款的苹果设备,并且无意追新的话,可能会发现经过几次系统升级后,即使不打开任何大型软件,设备本身就会热到烫手。如果查看 Activity Monitor,会发现 WindowServer 进程占用很高的 CPU(从 40% 到 100% 波动)。当然,如果没有遇到这个问题,那么恭喜你啦,文章剩余部分也不必阅读。

那么这个进程是做什么用的?WindowServer 是 macOS 的 display server,包含显示服务器和窗口管理器的功能,可以简单理解为功能类似 Linux 上的 X11。macOS 设备上屏幕显示的所有内容基本都由 WindoServer 负责管理、合成和发送给硬件进行渲染。

为什么 WindowServer 会长期占用过多的 CPU 资源?Well, 这个除了苹果谁也不知道,但苹果似乎并不打算修复这个 bug。如果你设备刚买回来,那一般是没有这个问题的;经过几次大的系统更新后才会发现设备无故变热。注意:如果你使用频繁更新屏幕图像的软件,或其他一些大型专用软件,或在浏览器中播放视频,那么 WindowServer 使用大量 CPU 可能并不是异常现象;本篇描述的只是在冷开机后不打开任何应用的情况下 WindowServer 无故占用过量 CPU 资源的问题。

首先当然尝试病毒和恶意软件扫描,排除中毒的影响。你可以使用第三方软件进行扫描,或手动排查各个 launch agent 和 launch daemon / login item。如果你平时并不放行没有代码签名的应用,那么一般扫描不会有什么结果。

其次,尝试重置 NVRAM / PRAM。这步的有效性非常可疑:在我看来这明显是一个软件问题,但按照苹果的说法 NVRAM 中存储的内容跟 WindowServer 根本没有任何关系。不过苹果的技术支持大概率会让你尝试一下,聊胜于无吧。那么,做都做了,为何不再试试重置 SMC 呢。

重置试过了,如果你可以接受浪费部分时间,或丢失部分数据的话,可以试试重新安装最新的 macOS 系统。安装步骤自己去苹果网站上搜索吧。

如果不想重新安装系统,得要搞点别的歪门邪道了。既然 WindowServer 是负责渲染屏幕内容的,那如果屏幕上没有内容需要更新,或者更新的内容很简单,也就没道理要占用 CPU。从这个思路出发,可以调整一些设置。

首先是右上角的时钟区域,如果使用数字时钟,把秒数关掉,这样一分钟只需要更新一次。

其次将所有桌面的壁纸更换成同样的纯色。其实这一步也很扯,因为我 99% 的时间看不到桌面;但试过之后发现居然是有点效果的,着实让人摸不着头脑。

再来去到 System Preferences,点开 Accessibility > Display,勾上 Reduce transparency:这会让一些透明的部件(例如菜单栏)的渲染压力减小。我同时也勾上了 Differenciate without color,虽然并不知道具体效果。

Preferences > Accessibility

如果你不使用外接屏幕,那么还有一个额外的优化点:回到 System Preferences,点开 Mission Control,将 Displays have separate Spaces 取消勾选。如此设置会让外接显示器上的应用不能使用 Split View,但可以降低使用内置显示时的系统压力。

Preferences > Mission Control

做完这些后我机器上 WindowServer 在系统空载时 CPU 占用可以维持在 10% 左右,可喜可贺。经过苹果的几次更新,系统 bug 越来越多,设备越来越烫手,我是大概率不会再买苹果的设备了。