«

»

May 22 2021

鸡肋一般的SuperFetch(SysMain)

这篇文章是为了我接下来的一篇文章预备的,因为太长了且主题比较专一,所以单独一篇发出来。

SuperFetch这玩意可是老有历史了,自 Vista 引入后有不少人抱怨过这玩意不靠谱。问题是这玩意在 Win7 下也是默认开启的,我用了 Win7 有足足10年(2010-2020),电脑换过多台,低速机械硬盘,高速机械硬盘,固态硬盘,却从未被这玩意坑过。

我很好奇,这玩意到底是怎么回事,于是专门去查了查,以我的理解来讲一下。

SuperFetch 的历史

SuperFetch 功能始于 Windows Vista(2006),用途是将系统上可能会使用的软件所需要的数据预先加载(pre-loads,以下预加载、预读 同)到空闲的内存中,以便在软件真正启动的时候直接在内存中读取,而非从硬盘读取。

因为2006年的机械硬盘读取速度真的很慢啊!

但是啊,2006年内存容量也很稀有好不好?

于是又有了 ReadyBoost,可以实现使用U盘等闪存的随机读写速度优势来提供性能。

问题是U盘的随机读写速度在2006年真的也不咋地啊!大多数U盘是主打着容量与价格优势来制造的。在接下来的很多年内,多数产品的随机读写优势甚至都被机械硬盘碾过去了,U盘只是个容量一般没人关心性能的便携存储工具而已。

之后电脑的标配内存也从512M涨到了2G,2G内存跑一个 Win7 32位版毫无压力。ReadyBoost甚至会拖慢系统。

接下来更高速的机械硬盘登场,3.5寸机械硬盘走向巅峰,家用 3T PMR 7200转 机械硬盘的随机读写碾压个廉价U盘不是事(而且也是PMR盘中性价比最高的);更大的内存登场,家用电脑4G内存起步;固态硬盘登场,基于硬盘的随机读写瓶颈消失。SuperFetch 从头至尾都没有个登场的位置。

SuperFetch 的局限性

想要发挥 SuperFetch 的效果,硬件上大概需要这么个条件:

  • 随机存储速度慢,但又不能太慢的硬盘+大内存
  • 随机存储速度慢,但又不能太慢的硬盘+小内存+一个随机存储速度比机械硬盘 快很多 但比内存慢的U盘

简单来讲,你需要这么一个场景:

  • 机械硬盘很慢(这样预读才有意义)
  • 但机械硬盘又不能太慢(不然预读阶段就卡死了)
  • 但又要比内存慢很多(毕竟内存才是重点)
  • 但又要比固态硬盘快(没固态硬盘快那直接读固态不就得了)
  • 但又不能比固态硬盘快(有固态硬盘那我直接读固态不就得了)
  • 但最好和固态硬盘快(但有固态硬盘那我直接读固态不就得了)(顺带一提,那个把操作系统本体装在机械硬盘上之后电脑插个固态做加速的安装方法就出自于此思路)

感觉就像是微软期望在2006年后有这样一个场景,问题是这完全不符合科学唯物主义!上哪搞这么一个场景出来?

垃圾 Win10

现在呢,微软在 Win10 中把 SuperFetch 改了个名叫 SysMain。事情呢,还是那么个事,问题是:

  1. 固态硬盘几乎是系统盘标配,随机读速度快得完全没预读必要
  2. 内存最低4G的都稀有,一般8G起步,16G才正常
  3. 机械硬盘虽然仍有安装软件,有预读的价值,但启动软件所需要的小文件读取速度完全超过其执行速度,大文件资源预读不起,在机械盘预读的提升价值太低。且单次启动的软件行为单一,软件数量太多行为不统一,导致要预读特别多可能根本用不到的文件(用户行为是不可猜测的,你再聪明也猜不透我今天想不想玩星际吧),而机械硬盘本身就是为了存储又大又多的文件而存在的(不然直接全固态多香)

别忘了以上说得全部都是存储相关的内容,想要 SysMain(SuperFetch) 还必须有CPU的介入才行,而如今硬盘内存都相较于以前全都翻倍了,Intel 却挤了多少年牙膏,原本是为了读写瓶颈的功能,脖子却卡到CPU上了。

而如今?想得美!

首先他这玩意叫预读(pre-loads),再怎么省略也是得读吧?那什么时候读?

  • 开机的时候读?牺牲开机速度来加载可能这次开机根本用不上的文件?
  • 空闲的时候读?什么叫空闲时间?我在用电脑的时候他不叫空闲!叫抢!(尤其是Win10,我不用电脑是认为Win10你在抽风占用CPU资源而在等你抽风完毕,而不是因为我闲下来了你好抽风!)

一个大型软件假如需要等待 11 秒才能完成加载,你 SuperFetch 提升到 1 秒,但是要牺牲掉我 10 秒的开机时间,而且因为你还加载了其他的不需要的资源,可能需要 100 秒的额外时间开机。而事实上目前基于机械硬盘的速度以及软件加载优化,启动大型软件根本用不着那么多时间(而且用户愿意为开启一个大型软件而等待那么久!),SuperFetch 自作多情的预加载可能连 10% 的时间都节省不下来,反而消耗了相当大量的 CPU 资源和硬盘IO。

从2016年到2021年这15年间,你就真蹲在成华大道蹲守一个去二仙桥的违章老大爷?能加速,只能加速一点点,不能加速太多。

这时候就要有人反驳了,我们推荐使用睡眠而不是使用关机。你去跟你们的曼哈顿人民说去!去跟你们的德克萨斯州人民说去!自己国家的供电都保证不了,嘚吧个屁!

 

哦,我还忘了说了,上面的内存指的全部都是 “空闲内存”。以前内存总容量小所以空闲内存小,现在内存总容量大了但是操作系统和软件所需的内存资源也大啊!空闲内存从来也没说够用过!(而且很有可能出现因为加载大型软件导致 SuperFetch 之前所占用的资源全被挤出去了)

(假设场景:假如我想要编辑一个视频,整个巨大的视频文件都加载到内存中,纯内存操作,没有机械硬盘的咔咔响,不香么?假如这时候我又需要同时开启个做图工具,我会在意那几秒钟的加载时间?)

鸡肋

 

哦对了,我还忘了说另一件事!

SuperFetch 是 Windows Codename “Longhorn” Build 5219 中出现的,名字叫 System Maintenance Service,简写为 SysMain 。Longhorn 后来成为了 Windows Vista,这项服务正式命名为 Superfetch。

在 Win10 中,SuperFetch 这个功能又被命名为 SysMain 了。

草,怕不是 Win10 团队把 Vista 开发版的代码拿来用了吧。

9 comments

Skip to comment form

  1. 小宝
    Google Chrome 91.0.4472.114 Google Chrome 91.0.4472.114 Mac OS X  10.15.7 Mac OS X 10.15.7
    Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36

    固态硬盘普及之后SuperFetch实际作用真的不大了

    1. 石樱灯笼
      Firefox 88.0 Firefox 88.0 Ubuntu x64 Ubuntu x64
      Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0

      一看就是一点都没读只为了评论的。

  2. jim
    Microsoft Edge 91.0.864.59 Microsoft Edge 91.0.864.59 Windows 10 x64 Edition Windows 10 x64 Edition
    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36 Edg/91.0.864.59

    要求微软给Superfetch定一个单一的预读策略,同时适应全SSD、SSD+HDD、全HDD的系统,CPU基准从双核奔腾到8核i7,还不能要求预先benchmark,这难度太大了。我是想不到应该怎么做,别家系统也没有更好的策略。

    1. 石樱灯笼
      Firefox 89.0 Firefox 89.0 Ubuntu x64 Ubuntu x64
      Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:89.0) Gecko/20100101 Firefox/89.0

      Superfetch这玩意的存在就完全没有必要。
      根据这十多年的服务器运行统计来看,全SSD、SSD+HDD、全HDD这三种场景下,Superfetch均会严重拖慢整个系统,而单一应用的提升却连0.1%都达不到。
      结论就是Superfetch不符合唯物主义,其存在所需要的场景在现实世界就是个空集。

      1. ZXGU
        Microsoft Edge 108.0.0.0 Microsoft Edge 108.0.0.0 Windows 10 x64 Edition Windows 10 x64 Edition
        Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.0.0

        贴主还在?Win11的sysmain打开后反而节省大量内存,并没有那种卡死的情况,本来1.2G不开软件的系统占用硬是降到了半个G,还不怎么影响读写文件和打开软件的速度。只是即使它自动开机启动,也没有拖慢开机时间,而是在开机后的一段空闲时间把内存折下来了,我认为是内核调度与预读方案的修改所致,能否研究?

        1. 石樱灯笼
          Firefox 106.0 Firefox 106.0 GNU/Linux x64 GNU/Linux x64
          Mozilla/5.0 (X11; Linux x86_64; rv:106.0) Gecko/20100101 Firefox/106.0

          自己研究去。我无兴趣。

        2. mochongli
          Firefox 109.0 Firefox 109.0 Windows 10 x64 Edition Windows 10 x64 Edition
          Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0

          sysmian关闭会把内存优化也一起关了
          get-mmagent

  3. 扎斯特欧逊
    Microsoft Edge 93.0.946.1 Microsoft Edge 93.0.946.1 Windows 10 x64 Edition Windows 10 x64 Edition
    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4558.0 Safari/537.36 Edg/93.0.946.1

    我最近也在研究这玩意 虽然我系统盘在固态里 但是特别小(110g) 所有软件游戏和数据都在机械里 而我的内存又特别大(128g)
    我这个情况是不是就适合这个sysmain呢?
    但是 我最近还发现了个软件叫primocache 一个第三方的内存加速磁盘软件 这个可定制的参数比较多.现在我就不知道用哪个了…

    1. 石樱灯笼
      Firefox 89.0 Firefox 89.0 Ubuntu x64 Ubuntu x64
      Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:89.0) Gecko/20100101 Firefox/89.0

      建议你重读一遍文章。
      你的机械硬盘只有和你的固态硬盘一样快的时候,这个功能才有意义,但同时又一点意义都没有了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据