什么是Superfecth?

Superfetch是Windows操作系统的一项服务(Service),它基于Windows XPPrefetch技术改进而来,首次出现于Windows Vista操作系统中。Superfetch能预先加载常用的库文件、应用程序到内存当中,以此来减少应用程序在需要它们的时候的加载时间,加快应用程序的启动。

Superfetch相较于原来的Prefetch技术的一大改进就是它能持续地分析应用程序的使用场景以及用户的使用习惯,将常用的应用程序按使用场景预先加载到内存当中。另外值得注意的是,这些预加载的内存数据在操作系统的剩余内存不足时会被释放掉。

Superfetch预加载的文件是直接加载到内存当中,会消耗一定的内存,但配合Superfetch服务的另外一项功能ReadyBoost,操作系统能将类似U盘这样的设备中的储存空间作为额外的内存使用。

SuperFetch is a technology that pre-loads commonly used applications into memory to reduce their load times. It is based on the “prefetcher” function in Windows XP. SuperFetch attempts to load commonly used libraries and application components into memory before they are required. It does so by continually analyzing application behavior and usage patterns, e.g. what applications are typically used in the morning after logon. The cache memory is marked with low priority, meaning that if another process needs the memory, it will be given up.
By default, the necessary files are loaded into main memory, but using a feature called ReadyBoost, Windows Vista and Windows 7 can use alternative storage such as USB flash drives, thereby freeing up main memory. Although hard disks usually have higher sequential data transfer rates, flash drives can be faster for small files or non-sequential I/O because of their short random seek times.[1]

Superfetch的历史

在以前,机械硬盘还是主流硬件水平,机械硬盘的读取速度普遍是较慢的,程序在加载的时候要从机械硬盘中读取文件加载进内存当中,机械硬盘较慢的读取速度会拖慢程序的启动,也就是我们俗称的“卡”

微软研发Superfetch技术秉持的理念就是:多余的内存与其让它放在一边不使用等它消耗电能不如将它利用起来

Superfetch技术首次在2005年由微软主办的专业开发者大会(PDC 2005)[2]公开演示。主讲人是“Windows之父”——吉姆·阿尔钦。

PDC 2005

阿尔钦在这次大会上主要介绍了Windows Codename “Longhorn”(Windows Vista 开发代号)Build 5219的新特性。其中一项重要创新就是Superfetch技术。

为了更好地演示先进的Superfetch技术,阿尔钦首先将系统中的内存“冷却”,之后让系统在未开启Superfetch服务的情况下让一些常用的Office软件连续启动并计时。

这是最终结果:

总耗时36.8秒

然后,阿尔钦再次将系统的内存“冷却”,之后开启Superfetch服务并打开了资源监视器。

可以观察到,开启Superfetch服务后,系统的剩余内存(红线)在逐渐减少,那是因为Superfetch服务在逐渐把数据预加载进内存缓冲当中。

最后,让系统对之前启动过的Office软件再次连续启动并计时。而此时,软件的启动时间已经明显缩短。

这是最终结果:

总耗时10.6秒

在脚本还未执行完毕之前,台下的观众已经为极快的启动速度感到兴奋甚至是欢呼。阿尔钦还说道:“这很酷吧?”

其实启动时间减少的道理很简单,那就是,已经把需要加载的一些数据在程序启动之前加载进了内存当中,这样在程序启动的时候就不需要再把全部数据堆到一起一次性加载。

虽然这项技术很是令人兴奋,但毕竟是两面性的。在2005年那个时候,256MB的内存还是主流,大内存还是很昂贵的,并不像今天那样宽松。这就引发了另一个问题,我哪里有那么多的内存空间给Superfetch用于预加载?接下来阿尔钦又介绍了Superfetch技术的另一项功能,这项功能就是后来的ReadyBoost。

阿尔钦拿出一支U盘

阿尔钦说道:“如果你没有一大堆的内存怎么办?嗯,我们想过这个。你知道现在许多人都有U盘这种东西吧?”之后,阿尔钦拿出了一支U盘,将它插入到电脑当中,不久,资源管理器显示,系统又多了一些内存。

在大内存价格昂贵的情况下,插个U盘就增加了500MB的内存。台下的观众因此突然又响起一阵欢呼。

这些内存来自哪里?原来,就来自刚才插入的U盘当中,系统自动地将U盘里的储存空间用于内存使用,这样,系统又增加了一些内存(绿线)可以用了。而且,这些新增的内存能在很短的时间内得到利用(从图中的绿色线逐渐下降就能看出来)。这些写入到U盘中的内存数据,是经过2x加密的,因此可以防止在用户拔出U盘时数据被盗。

至此,Superfetch功能介绍完毕,它成为Windows Codename “Longhorn” Build 5219的一项重大改进。

在Windows Codename “Longhorn” Build 5219中,Superfetch的名字叫System Maintenance Service

Windows Codename Longhorn Build 5219[3]

在Windows Vista正式版中,这项服务正式命名为Superfetch。注意,这项服务默认是开启并且是自动启动的。另外,在Windows系统启动时,Superfetch需要从缓存文件中将数据读入到内存当中,这会增加系统的开机时间。因此,微软建议,用户在Superfetch开启时应多使用系统中的“睡眠”功能,这样预加载的内存就不会因为系统关机而被释放掉。

Windows Vista作为一个全新的Windows系统,在正式版发布后,市场却反响平平。原因是Windows Vista相较于前代Windows XP推出了一大堆与当时的硬件水平严重不符合的功能。(读者有兴趣可以去了解下Windows Vista的开发历史,就知道为什么微软会在一代操作系统就推出如此多的新功能)在众多问题之中,最为饱受诟病的就是极高的内存占用。前面也提到了,在当时的消费者市场,256MB内存的机器还是主流,能有1G内存的机器都是凤毛麟角了。Superfetch是吃内存的,而当时的内存又不够用,虽然微软还有ReadyBoost给用户增加内存来提升性能,但是站在消费者的角度来讲,这个功能仍不太实用,毕竟U盘等设备的读写性能又参差不齐,很难实现性能上的统一。总之,Superfetch作为Windows Vista一项重大功能在当时还是机械硬盘为主流的时代,的确能起到加快程序启动的效果,但因为硬件原因,最终未能达到很好的效果。

到了Windows 7时代,Windows延续了Superfetch这一特性。此时,硬件水平已经有了很大的提升,市面上开始出现2G甚至是4G内存的机器。但此时硬盘读取性能也有了提升,所以对一般用户而言,Superfetch对提升性能的效果并没有以前那么明显了。

李开复先生:

Windows Vista/7 的SuperFetch服务是为企业应用与大型协作软件而设计的, 个人用户没有必要开启. 在大型企业中使用的专业软件中与企业策略管理, 数据库启动过程中会长达10分钟之久. 而运用SuperFetch, 可将启动时间降低到6分钟以内. 而对个人的用户来说, 平时使用的日常软件本身的启动时间非常短 通常在1-2秒之内, SuperFetch这时候的提速只是0.2~0.5秒, 基本可以被认为是毫无作用, 而且还会加大对硬盘的监测(损失CPU性能时间)与读取时间(增加硬盘IO寻址线程分配). 而SuperFetch对游戏程序是无效的, 对于个人用户与游戏玩家来说, 开启此服务只会无形损失CPU的性能时间与损失硬盘IO寻址的线程性能.

之后的Windows 8/8.1时代,Superfetch造成了100%硬盘占用的问题。Superfetch像以往一样把硬盘中的数据预加载到内存当中,但此时如果用户使用的是机械硬盘,机械硬盘慢的读取速度会让磁盘持续被占用而引发系统性能下降。但对于使用固态硬盘的用户而言,Superfetch会默认关闭,因此不会有因为Superfetch而造成100%硬盘占用的问题。

Superfetch的今天

现在,Superfetch依然存在于Windows操作系统(Windows 10 Build 17134)中。

Windows 10 Build 17134

虽然Superfetch技术在机械硬盘还是主流的时代的确能发挥好的作用,但逐渐地,固态硬盘开始普及开来,固态硬盘拥有更快的读写速度。当一个程序需要加载的文件存在于固态硬盘时,能在极短极短的时间内加载到内存当中。因此,Superfetch预加载内存对提高程序启动速度的效果就微乎其微了。

Superfetch技术因为固态硬盘的普及而作用逐渐被减弱了。但在一些领域(to B),Superfetch仍在发挥其作用。

微软方面也表示,在系统有固态硬盘时,Superfetch以及它附带的一些功能会默认关闭。[4]

Q:Will Superfetch be disabled on SSDs?

A:Yes, for most systems with SSDs. 
If the system disk is an SSD, and the SSD performs adequately on random reads and doesn’t have glaring performance issues with random writes or flushes, then Superfetch, boot prefetching, application launch prefetching, ReadyBoost and ReadDrive will all be disabled.

当用户使用的是固态硬盘时,Superfetch连带其附加功能会被关闭

在Windows 10 Build 17682.1000中Superfetch服务更名为SysMain(SysMain是Superfetch的服务名称,Superfetch是SysMain的显示名称),但微软方面并未对这一改动做出说明。

Windows 10 Build 17682.1000

结语

尽管距离Superfetch技术诞生已经过去了很久,但是如今仍有相当一部分用户对Superfetch存在误区。其中大多数认为它就是个吃内存而毫无作用的东西,应该关掉。实际上,对于机械硬盘+大内存用户而言,这项服务对提升系统性能还是有作用的,对于固态硬盘用户而言,作用不大。在固态硬盘已经逐渐普及开来的今天,这项服务的实际效果也在逐渐地削弱。

也许,正如当初Windows Vista的名字“Vista”——“展望”,展望那个电脑性能突飞猛进的未来。

参考资料

[1]Superfetch

[2]PDC 2005 Keynote with Jim Allchin

[3]Windows Vista Build 5219 & PDC 2005: “Super Fetching”

[4]Steven Sinofsky (May 5, 2009). Support and Q&A for Solid-State Drives. Mircosoft Developer.

分类: 技术小记

1 条评论

小宝 · 2019年5月22日 下午7:33

Google Chrome 74.0.3729.131 Google Chrome 74.0.3729.131 Windows 10 x64 Edition Windows 10 x64 Edition

原文转自我自己的知乎。

发表回复

Avatar placeholder

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


The reCAPTCHA verification period has expired. Please reload the page.