欢迎光临 Enjoy IT (ITECN.NET) 登录 | 注册 | 帮助

SuperFetch,您受委屈了(二)

关键字 Windows Vista SuperFetch
作者    盆盆
难度    Level 300

上回说到要做一个实验,证明SuperFetch的效能。但实际上,要做出不受干扰的实验,非常难。所以本文设计了一个模拟的演示,来说明SuperFetch的作用。

在实验之前,先补充一下SuperFetch最基本的原理,以便初学者能够更好的理解:

物理内存的组成

在Windows里,我们可以简单地认为物理内存有以下五个部分组成:

  1. Working Set:工作集。这是每个进程所占据的物理内存部分。
  2. Standby List:当进程工作集收缩时,释放的page,如果没有修改过,或者修改的内容已经写入Page File或者硬盘文件中,这部分Page可以直接写入Standby List。
  3. Modified List:当进程工作集收缩时,释放的page,如果已经修改过,但是尚未写入Page File或者硬盘文件中,这部分Page叫做Dirty Page,直接写入Modified List。
  4. Free List:进程退出所释放的内存page,可能包含不确定的内容。
  5. Zero Page List:Free List里的Page可能存在不确定的内容,导致进程出错,所以需要定期进行清零。

系统会定时启动修改页写入线程,把Modified List里的Page写入硬盘的Page File或者其他文件里,然后把释放的Page插入Free List。

如果Free List超过8个Page,则自动触发清零线程,把Free List的Page内容清零,并插入Zero Page List。

当应用程序请求Page,但是这些Page不在进程的Working Set里,那么就会发生Page Fault事件。

如果这些Page位于Standby List或者Modified List里,则叫做Soft Page Fault事件,进程可以直接从Standby List或者Modified List里摘取Page,然后放入进程的Working Set里。

如果这些Page不在Standby List或者Modified List里,则叫做Hard Page Fault事件,只能从Page File或者硬盘文件里调取,这就要发生磁盘I/O,系统性能就会受到限制。

可用内存包括以上的三个部分:Standby List、Free List和Zero Page List。也就说,这些List里的Page,Windows可以直接分配给任何一个进程。

SuperFetch实际原理

可以归结为一句话,就是为可用内存的完美利用。只要内存的Free List和Zero Page List不为空,就会预加载常用进程的代码和数据,并把这部分Page插入Standby List。

这样的话,启动常用进程时,虽然会发生Page Fault,但是其中很多属于Soft Page Fault,直接从Standby List里摘取,所以不需要磁盘I/O。

Standby List的优先级

在Windows Vista里,不仅仅CPU有优先级,内存和磁盘I/O都有优先级。

在Windows Vista里,一共有八个Standby List,分别对应不同的内存优先级(0~7),进程默认优先级是5。

这样,如果内存不够,不得以要摘取Standby List里的Page,可以先从低优先级的Standby List中摘取,不会影响高优先级的进程。

可以用工具查看(绿色的是八个Standby List,红色的是Zero List和Free List):
1
实验-禁用SuperFetch,空闲内存越多,进程启动速度反而越慢

接下来的模拟演示,就是要证明,如果禁用SuperFetch,空闲内存越多,速度反而越慢。

实验条件:关闭一切可能干扰系统的后台进程,例如Windows Search、Windows Update,病毒扫描等等,还可以禁用Aero、UAC等。

实验机器:虚拟机,512MB内存,双核1.66MHz的CPU。

假设常用进程是Outlook 2007。

启动计算机,确保启用SuperFetch,等到系统完全预加载完毕,不再产生磁盘活动时,启动Outlook,多做几次实验,并记下平均启动时间T1,这里是6秒。并记下空闲内存M1,这里是11MB。

禁用SuperFetch,重新启动计算机,记住一定要重启,以便释放Standby List。等到系统登录结束,不再产生磁盘活动时,启动Outlook,多做几次实验,并记下平均启动时间T2,这里是17秒。并记下空闲内存,这里是212MB。

11MB和212MB,谁多谁少?

而6秒和17秒,谁多谁少?

而禁用SuperFetch后,虽然空闲内存增加了将近200MB,但是进程启动速度反而降低约2/3。

小考

光看文章,如果不过瘾,那么看看问题小考吧,这里盆.盆提以下几个简单问题,推荐初学者不妨思考一下,可以更好地理解SuperFetch和内存管理:

1. 为什么可用内存不包括Modified List?

2. 为什么说SuperFetch缓存不会减少可用内存?

3. 为什么SuperFetch反而会降低磁盘的损耗?

4. 请用Standby List的优先级,来说明Windows Vista是如何解决午餐综合症的问题。

何谓午餐综合症

在Windows 2000/XP中,如果打开WORD文档,当时性能不错,但是吃中饭后回来,再处理这个WORD文档,会发现速度很慢,这就叫做午餐综合症。

已发表 2007年6月18日 13:36 作者 ahpeng
归档在:

评论通知

如果您想在帖子更新时接到邮件通知,请先登录。这里

订阅帖子评论使用 RSS

评论

2007年6月18日 17:15 by Heero

# re: SuperFetch,您受委屈了(二)

盆盆老师,今天在跟人讨论superfetch的时候有人提出:

[引用]

如果用电驴的话,这会变成用户的噩梦,疯狂的读Part文件。

不是否认它的效果,只是觉得有些文件它没有必要去读。

用SysInternals的ProcessExplorer仔细分析过了,对电驴Part文件的读取次数已经到了过分的程度了。

[/引用]

请问真有这种情形吗?

我自己也有在Vista里面使用eMule,倒没觉得挂em过程中磁盘访问有什么异常……

2007年6月18日 17:28 by sveir

# re: SuperFetch,您受委屈了(二)

感谢盆盆作出实际分析让广大网友走出误区

2007年6月18日 21:38 by ahpeng

# re: SuperFetch,您受委屈了(二)

To Heero:

感谢您的回复!并期待经常到ITECN做客!

您提了一个非常棒的问题,对于这个问题,我是这样理解的:

1. Windows并不会缓存所有大容量的文件,只有经常需要访问的进程,才会缓存其所需的文件。

2. Windows只会缓存这个文件里经常需要访问的一部分,而不是缓存所有的内容。

3. Windows的这种缓存,用的是低优先级的磁盘I/O,不会干扰前台进程。同时,只有存在空闲内存时,才会缓存。

4. 这种缓存,不会占用我们的可用内存。

事实上,只有最常用的进程,才会缓存其所需读取的内容,这些内容今后很可能会被进程读取到,所以这种缓存还是合算的。而且利用的是空闲内存,这部分内存空着也是浪费。

不过如果计算机主要用来执行诸如电驴、BT等后台工作,而很少进行用户交互,那么推荐关闭SuperFetch,因为SuperFetch更适合于桌面OS。实际上,在Windows Server 2008上,默认关闭SuperFetch。

2007年6月20日 16:23 by ahpeng

# re: SuperFetch,您受委屈了(二)

To sveir:感谢老大支持!

2007年6月27日 22:34 by VistaLearner

# re: SuperFetch,您受委屈了(二)

向彭老师学习, 准备天天来看blog.

2007年8月14日 16:29 by martinguo

# re: SuperFetch,您受委屈了(二)

请教盆盆大虾一个问题,

我用的是商业版的Vista系统,有个很怪的问题。

早上开机到午饭前后,系统运行的很流畅。但是下午开始系统就会越来越慢,打开个Word2007就要响应很久,还有其它应用程序操作也很慢,不得已只得关机再重启,可是问题并没有解决。郁闷ing

我的电脑配置如下:

CPU:CORE2 T7100

内存:1GB DDR2

2007年8月14日 19:04 by ahpeng

# re: SuperFetch,您受委屈了(二)

To martinguo:推荐你到微软中文技术论坛上提问,地址可以参考我的帖子。

2007年9月5日 16:21 by beastslayer

# re: SuperFetch,您受委屈了(二)

终于明白午餐综合症了~~~!!!

2008年4月4日 12:01 by Sterry

# re: SuperFetch,您受委屈了(二)

对于SuperFetch不知道说什么好,观察了一阵以后发现它的缓存选择判定还是存在很大的问题。例如我把不常用的一个DVD光盘镜像文件刻录后保存,准备下次清理时从磁盘上删除。这个文件有整整4G,在刻录过程完成前后2-3天都没有再去访问过这个文件,后来监测了一下SuperFetch过程,竟然每次SuperFetch都会去主动缓存这个4G镜像文件...造成了大量完全没有必要的磁盘IO.类似的现象也发生在另一个2G大小从DV导入的MPEG2待编辑视频文件,这个文件因为没时间去处理我至少有2周没有去访问过了结果它也会每次都被尝试缓存。补充说明下我用的是64位的Vista,内存4G.

对于上面的现象有什么好的建议么?

2008年4月27日 19:15 by lookme

# re: SuperFetch,您受委屈了(二)

要使用2周以上才能统计出常用的那部分需要缓冲的软件吧,新系统的话所有软件都认为是常用的

# Chemmy's Blog » Blog Archive » Vista???SuperFetch

说说您的看法?

(必填) 
必填 
(必填)