PCEVA,PC绝对领域,探寻真正的电脑知识
开启左侧

谈大容量内存的各种使用方案对磁盘效率影响

  [复制链接]
jeffxl 发表于 2012-1-22 17:58 | 显示全部楼层 |阅读模式
点击数:108170|回复数:282
本帖最后由 jeffxl 于 2012-1-24 22:17 编辑

以下内容为JEFFXL原创内容,欢迎转载并注明出处


        在内存价格很低的今天,现在很多用户都配置了大容量的内存(8G或以上)。也有很多低内存(4G或4G以下)的朋友想通过升级内存或者SSD来提高IO操作体验。但是,我发现关于内存和SSD对家庭用户的IO操作体验上有这样或那样的误区。比如,很多人使用EWF系统、各种软件缓存系统,各种RAM盘技术,想借此来提升IO操作体验。经费紧张的用户还有的陷入加大容量内存还是上SSD的纠结之中。以下我来说说各种方案和各种应用场合,大内存容量和SSD对用途体验在实际应用中究竟产生什么体验上的区别。

        关于用户软件对内存的利用
        一般我们知道,32位操作系统(只谈NT核心,暂不谈PAE技术)的寻址能力是4GiB,NT核心的操作系统在管理物理内存时在用户层进程上做出了一定的限制。首先,各种硬件和驱动需要单独寻址空间,这个部分按硬件和硬件数量的不同而有些差异,一般32位系统除开硬件寻址占用后最大全局可用容量大部分为3.25G-3.9G之间,这里的占用为硬性占用,无法在用户层面做出任何调整。而操作系统对内存的管理又分为系统级(RING0)和用户级(RING3)两个部分。系统自身保留最大2GiB寻址范围作为系统级调用使用,又称为内核模式地址空间。而用户级应用被分配剩下的2GiB寻址范围作为可用地址,又称为用户模式虚拟地址空间。那么,软件总共可用内存地址范围为2GiB,用户层软件单进程最多可以申请2GiB内存(32位保护模式,每进程在隔离的“虚拟”映射地址当中寻址,进程间互不干扰),通过 boot.ini中 /3gb 参数的调整可以达成用户模式使用3GiB的内存容量,而系统只保留1GiB作为进程地址空间。调整boot.ini中 /3gb 参数可能会导致一些兼容性问题,PAE扩展寻址到36位也是同样,但用户模式还是2GiB或3GiB限制,只不过可以同时开启多个占用2GiB内存的应用或者提高系统缓存效率,而无需使用页面交换。NT6核心以后的系统请使用命令行键入bcdedit /set IncreaseUserVa 3072来配置用户模式可用内存到3GiB(使用2048参数来还原)。

注:微软知识库关于内存使用和 /3GB 开关的知识库文章
http://support.microsoft.com/kb/328882/zh-cn

        X64环境下,对于 Microsoft Windows 操作系统,为了避免内存页表太大,目前可用的寻址范围实际为44位地址,也就是16TiB,并不能达成全部64位寻址范围的16 Exabyte。这里有一个问题,现在家庭用户99%还是使用32位软件进程来跑应用,上64位系统只是为了提供更大的寻址范围支持更多的内存,那么能够使用这么多内存吗?目前WOW64对32位程序基本完美兼容,但是在跑在32位兼容模式下的应用同样需要遵守32位用户模式寻址范围的限制,也就是2GiB或者通过牺牲兼容性调整到3GiB。那么如果在没有使用原生64位程序时,不多开N个大型应用软件的话(每进程最大可提交2GiB内存),那么大容量内存很显然没有得到充分的利用。

        WIN7缓存机制
        那么在X64环境下使用Microsoft Windows 操作系统,在已有大容量内存的条件下又没有开启多个32位大型软件的环境下,大内存就没有任何用武之地吗?显然不是,如WIN7 X64操作系统自身提供了一套动态缓存机制,会尽量使用最大的“可用"内存容量来缓存用户软件数据并使用Superfetch技术预加载经过统计的用户“热”数据,未被系统、用户程序和缓存占用的为“空闲”容量。这里的“空闲”和“可用”容量并不是同一个意思,大家可以在WIN7的任务管理器的性能标签页内找到。


WIN7任务管理器,“物理内存部分”
可用内存容量等于总内存容量减去系统和软件占用的容量(大约)
空闲内存容量等于可用容量减去已缓存资源的容量(大约)


       WIN7会动态管理缓存大小,而且是全局的机制,覆盖所有存储卷的内容。WIN7缓存机制是由最大“可用”容量来决定“空闲”容量的缓存占用(有点绕口);所有未被系统和软件占用的“可用”容量都可以被用来缓存,都是“空闲”容量;随着缓存的慢慢载入,“空闲”容量会慢慢变少,而软件可申请使用的“可用”内存容量不变,被占用“空闲”容量的缓存部分随时可以因为应用软件的需要而随时释放。这里既提供了应用随时可用的“可用”空间来运行程序,又最大效率的利用了“空闲”空间来缓存资源。这个时候,大内存就起到了加速IO操作的用途。在这里,如果提供足够的“空闲”容量,那么WIN7的缓存机制几乎可以抵消大约90%以上的IO压力,使磁盘IO压力得到极大的释放,这也是当前SSD在大内存容量,X64环境下,有的用户觉得SSD对IO体验的提升不太明显的最大因素,因为操作系统自身的缓存机制已经充当了最大的IO压力缓冲区。相反小容量内存用户升级SSD反而会得到体验上很大的不同,这个问题相对看待,其实只是因为内存使用溢出而频繁使用页面交换(虚拟内存)导致机械盘非常不擅长这样的场合,而SSD在4K性能上比机械盘好太多的原因(页面文件操作几乎为纯4K的IO)





        关于大内存环境下使用EWF系统、各种软件缓存系统,各种RAM盘技术对磁盘效率的影响
        X64 Microsoft Windows 操作系统环境下,使用各种RAM作为数据缓冲区的技术的各种方案,虽然可以提供一定的IO操作提升,但是在WIN7 X64环境下,这些软件有一定的局限性和增加软件环境复杂性的问题,可能产生一些未知的易用性问题。在家用领域,这些软件方案不一定能达成比WIN7 X64自身缓存机制在大容量内存支持下更好的性能,WIN7缓存机制篇章已经做出了说明。

       先谈第三方缓存软件部分
       这样的软件一般给出了定向的设置范围和固定的内存提交方式(容量占用固定),操作方式固定且有需求范围局限性,用户操作行为的不可预知性提供了不同的缓存命中率(看使用的这些应用是集中还是离散的),且缓存命中率的不同提供了不同的性能增益,效能有不确定性。而这个操作方式相对目前家庭用户来说并不比WIN7自身的缓存机制的管理方式优秀,并不适合在WIN7下部署这样的第三方缓存软件。这里需要谈到一个数据命中率聚合性分布的问题。在家庭用户当中,在一次开机和关机的工作循环里(因为内存是易失性存储),各种缓存机制按基于数据访问热度的算法提供了软件二次加载加速和一定的热数据命中率来提供IO性能增益。
       我不认为WIN7自身已有的缓存机制在典型家庭用户上会提供低于任何第三方缓存机制的效率。因为WIN7缓存机制的普适性,一般测评软件会避开WIN7的缓存机制,所以在测评上得不到好的成绩,而第三方缓存软件会“骗过”测评软件,所以可以达成很高的“分数”,而这个分数带来的体验,在数据二次加载上得不到比WIN7自身缓存机制更好的效率,WIN7自身的缓存机制是动态利用最大可用内存动态管理的,比第三方软件效率来得高,而且在需要时应用可以随时申请剩余的内存,缓存部分自动减少。而第三方应用是申请固定内存对指定目标进行缓存,损失了灵活性和普适性。
        这个部分,WIN7如我上面说明的那样,提供了更好的灵活性和普适性。额外增加第三方缓存软件增加了软件环境复杂度和管理上的复杂度,并不能提供更适合家庭用户的缓存机制。因为家庭用户一般连续开机工作循环时间不长,而一次工作循环需要载入的数据在逻辑分布上的数据总容量上远超过内存容量,重复访问性平均又不高。如果需要达成全局最高的命中率,需要很大的内存(按用户应用软件使用的分布),而如果命中率过低,缓存机制效能就得不到很好的发挥。 在这里,从容量价格比相对更便宜的磁盘系统上做出改善,得到的体验远大于部署这类第三方缓存软件。
        在部署SSD后,热数据可以按需人工分布在SSD上,因为同容量的SSD比内存便宜,而内存缓存机制又不能覆盖所有家庭用户的数据访问,有缓存未命中风险(家庭用户定向缓存所有可能访问的内容需要的内存容量太大,没性价比)。而剩下的未被缓存命中的应用程序IO压力可以通过SSD提供的IOPS来达成更好的IO操作体验(就算WIN7缓存平均承担90%,也有10%未命中)。HDD体验不佳的地方,就是WIN7缓存机制未能缓存命中时产生的,比如初次载入程序或冷数据的载入。所以家庭用户不能纯依赖大容量内存来提供等效的IO体验。

         Windows操作系统的缓存系统是基于全局进行缓存,即对所有数据进行缓存,而第三方软件缓存可以根据用户需要,设置仅对某一特定分区或磁盘进行缓存。在同等缓存容量下,后者更具目标性,从而对定向目标提高了缓存命中率。
        拿无盘网吧的无盘系统镜像服务器举例,99%的访问是定向可控的。多用户启动和运行XP无盘工作站系统的过程所使用的数据经过统计,在范围和容量上趋向固定的550M左右的特定数据。这里提供第三方缓存软件并在服务器上锁定缓存内容(只定向缓存无盘系统镜像分区),只需要稍微大于550M的缓存容量就可以为工作站操作系统读部分提供接近100%的读命中。因为无盘服务器一般是连续运行的,单次启动工作站时需要的操作系统部分数据和保证平时运行的系统数据(大约550M)就会被服务器缓存,而后只要服务器连续开机状态下,其他工作站的启动过程和操作系统运行时需要的数据全部都几乎可以通过服务器内存来并发读取,提供了接近纯内存的并发性能。这里的无盘服务器指的是狭义的只提供操作系统启动和运行部分的无盘系统镜像服务器,应用内容由ISCSC架构提供(应用访问部分甚至需要SSD做2级缓存)。类似这个方案对第三方缓存系统才具有最大的使用效能,目的是为了锁定缓存范围和缓存高命中率。
        无盘服务器和单用户使用的区别就在于,在单用户(比如家庭用户)本地看来,单次工作循环中读分布几乎是全局离散的(用户行为无法预知),需要本地全局缓存,数据模型聚合性相对并不高,在单次工作循环中大部分访问重复性低,本地缓存重启则丢失,需要多个工作循环的热数据统计配合预加载技术来保证缓存效率。而N个这样的单用户组成的多用户群组,在无盘服务器端看起来就有了相当大的数据访问聚合性,所以这里的区别是相当大的。比如可以至少分离出多用户的操作系统启动和运行所需要的基本数据模型是完全一致的。而多用户应用访问上也可以而统计出这样的趋同性,比如无盘网吧的游戏访问热点局限在少数热门游戏上。统计学上的数据模型聚合性和一致性则是定向目标缓存系统高效率、高命中的最基本保证。
      

       再谈各种RAM盘技术和系统再封装,内存回写技术
       这里包含但不限于各种生成RAM磁盘后迁移浏览器缓存文件夹、各种临时文件的环境变量到RAM盘、EWF系统、虚拟机镜像读,由内存回写的技术。这个部分,提供的IOPS增益产生了一个用户体验瓶颈的问题。家庭用户如果部署了SSD,在已有的系统自身缓存机制下,加上SSD补充了系统缓存未命中的部分承担剩下的IOPS压力,已经提供了很好的IO操作体验(原因如前文)。而再累加这些技术方案,并不能在用户体验上得到更好的附加增益。而由此带来比第三方软件缓存技术更复杂的操作管理性问题和可能的诸多易用性问题,这里我认为是得不偿失的。而在HDD环境下,如果没有特殊需求,则也不推荐使用这些应用方案。
        额外补充一个关于大内存环境下虚拟内存是否需要禁用的问题。这里我不建议完全关闭虚拟内存,有部分软件和系统操作必须使用到页面文件交换,为了兼容性考虑,请至少保留1G左右的页面文件来保证最大的系统和软件兼容性,而且这样做并不会降低任何IO性能。


         总结:
         WIN7的缓存机制本身就是为单用户的数据访问模型而设计,家用环境需要非常好的普适性和易用性,如全局缓存、无需用户干预、全局透明、自动管理。NT6系列系统,除了有热数据命中率导向算法的常规方式缓存外,还有由Superfetch提供的缓存预加载技术很好的统计和学习了用户的行为习惯,很好的融合了易失性内存缓存机制,提供了一定的数据初次加载加速的可能性,又因为是可动态管理的全局缓存,缓存的占用对应用程序内存申请完全透明,对用户完全透明,所以WIN7缓存机制是最适合家庭用户环境的智能缓存技术。
        除非需要保证指定的特殊目标极高IOPS的场合(比如为指定目标提供内存的IOPS能力),大内存用户在WIN7 X64环境下一般不建议使用任何第三方缓存软件和各种RAM盘和系统封装,内存回写技术。得不偿失,损失了全局缓存效能,增加了软件环境复杂度、降低可靠性和易用性。
        首先,升级SSD可以在任何环境下提供全面的IO效能提升;如果需要更佳的应用程序IO操作速度,那么增加内存并由WIN7自动管理可用内存作为动态缓存也是一个好办法,空着不用也是一种WIN7的内存“用法”

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 9活跃度 +45 收起 理由
挥剑下江南 + 5 赞一个!
博士仑 + 5 赞一个!
akjz + 5 很给力!
tanzibin + 5 赞一个!
liwenchao + 5 赞一个!
不明真真相 + 5 赞一个!
kid-man + 5 赞一个!
itbeta + 5 很给力!
drifting + 5 赞一个!

查看全部评分

luoyu_1980 发表于 2012-1-22 19:46 | 显示全部楼层
这个第三种是指用ramdisk这样子的软件模式吗?

点评

是的  发表于 2012-1-22 20:23
yxxiangkun 发表于 2012-1-22 20:17 | 显示全部楼层
办公就配ssd,游戏机就配大内存。有钱就都配了
anforu 发表于 2012-1-22 21:46 | 显示全部楼层
很好,我一直认为,使用win7系统的HDD,打开过一次程序后,再次打开的速度堪比SSD的主系统,这也是我两台电脑上进入系统长久后操作感差不多的原因
win7的缓存机制起了很大作用.我发现操作感差不多后,果断删除了一切ramdisk,cache类的软件,空出所有内存让win7自由分配
ggxuelei 发表于 2012-1-22 21:56 | 显示全部楼层
很好的分析!
hd5650m 发表于 2012-1-23 11:13 | 显示全部楼层
支持一下了
mustardgs 发表于 2012-1-23 11:24 | 显示全部楼层
禁用虚拟内存的时候系统只提示会不保存错误日志 会导致兼容问题是因为你的内存还不够大 如果确定物理内存够大 关闭也不会有问题

比如全开运行crysis
4G内存 禁用虚拟内存 第2张图load到一半就自动退出 打开虚拟内存 问题解决
8G内存 禁用虚拟内存 没有任何问题

感觉win7就算禁用了虚拟内存 还是在物理内存里映射了一个地址范围专门用来放页面文件

点评

这个地球上有个软件叫 PS  发表于 2012-2-2 22:37
pengjjtt 发表于 2012-1-23 12:40 | 显示全部楼层
学到知识了,谢谢兄弟!
我曾经也在看过相关虚拟软件的评测后,纠结于使用与不使用第3方软件管理内存。
之后还是因为8G内存用在2台电脑上,一台电脑只要4G内存了,所以才没有再考虑这个事情。
楼主能说一下,我现在用WIN7 64位系统,4G内存,H67主板,2400S的话,还要不要装第3方软件呢,主要是用来办公与高清电影。

点评

姐夫大人意思是,不用装!!!  发表于 2012-2-15 23:40
学到的知识要用起来 嘿嘿  发表于 2012-1-31 10:17
看了帖子还不明白?  发表于 2012-1-23 17:19
drifting 发表于 2012-1-23 12:43 | 显示全部楼层
我欣赏能写出实在的技术贴的技术区版主

楼主啥时候给网吧服务器的无盘回写方案出个专题啊。。

另外关于内存利用也还有不少问题,比如说 Win7 有个功能是使用系统内存做虚拟显存:



我想知道:

1、什么情况下虚拟显存会开始占用掉物理内存?是仅发生在爆显存的时候?还是说发生在接近爆显存的时候?还是说就算显存空闲很多,系统也永远会试图“回写”一份已占显存的镜像进入物理内存?对 Win7 而言,独立显存是处于物理内存更高一级的缓存体系?

2、32 位系统下,如果不用 /3gb 开关和用 /3gb 开关,分别最多识别多少显存?64 位系统下的 32 位应用程序又是什么情况?

3、对于一个 32 位应用程序,显存寻址的时候,页表是我的图中的整个 15GB?

4、虚拟显存所占据的物理内存,在任务管理器里面应该看哪个进程名?是挂名为显卡驱动还是挂名为游戏进程?看哪一列?“Memory Working Set”?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

点评

http://msdn.microsoft.com/en-us/library/windows/hardware/gg487348 你可以参考MS的官方说明。  发表于 2012-1-24 00:48
那个共享系统内存部分是沿用的“AGP边带寻址”技术,可以参看类似百科内容  发表于 2012-1-23 18:22
sscroft 发表于 2012-1-23 14:19 | 显示全部楼层
为了兼容性桌面级系统不提供PAE支持。

桌面级有提供PAE支持,但最高内存限制在4g,PAE是DEP的前提

点评

你说的没错。此文这个对小白我是这样表达的,没有详细分解清晰,32位系统/进程申请更大内存需要微软AWE的API,是基于PAE技术的。  发表于 2012-1-23 18:25
windingway 发表于 2012-1-23 15:44 | 显示全部楼层
结论:
1,Win7的内存管理机制战斗力较强
2,使用第三方软件虽然跑分惊人,但却降低了系统的可维护性
3,家用机用途广泛,IO操作离散型极强,内存缓冲命中率有限
1+2+3=普通人用大内存,内存管理交给Win7;追求体验的用户使用SSD,并将经常读取的文件置于其中;第三方软件对普通人来说意思不大。
luoyu_1980 发表于 2012-1-23 19:24 | 显示全部楼层
还有个问题,如果是vista系统的内存系统也是如此吗?用ramdisk有效果没

vista系统的游戏兼容性比win7好多了
jeffxl  楼主| 发表于 2012-1-23 19:37 | 显示全部楼层
本帖最后由 jeffxl 于 2012-1-23 22:34 编辑
luoyu_1980 发表于 2012-1-23 19:24
还有个问题,如果是vista系统的内存系统也是如此吗?用ramdisk有效果没

vista系统的游戏兼容性比win7好多 ...


是的,而且VISTA是个重IO负荷的操作系统。后台有大量的IO操作在并行,这个系统非常适合SSD。

举个例子,VISTA比WIN7有高得多的缓存预加载优先级,几乎在系统启动到桌面后立即使用非常高的IO流量立即填充剩余内存,直到可用内存被缓存接近填满。当时VISTA的时代,机械硬盘随机效能本身就不好,那个时候更差一些。所以感觉VISTA后台IO进程非常臃肿,在那个时代的硬件条件下变得非常不合时宜,受到大多数用户的诟病(当然还有其他易用性问题,而不只是持续的IO压力大)。

VISTA的缓存技术更甚于WIN7,可以说VISTA是一个想做到几乎无所不包,无所不用其极的系统,超越了当时的硬件能提供的条件。缓存高强度填充操作和更新操作导致当时机械盘的体验相当的差劲,起了相反的作用。而摆到现在,上了SSD后使用VISTA,那么这个缓存填充和更新的速率就可以得到SSD的IOPS支持,提供了更好的缓存效率(填充更快,更新更及时)
jeffxl  楼主| 发表于 2012-1-23 19:44 | 显示全部楼层
luoyu_1980 发表于 2012-1-23 19:24
还有个问题,如果是vista系统的内存系统也是如此吗?用ramdisk有效果没

vista系统的游戏兼容性比win7好多 ...

需要注意VISTA没有TRIM支持


你怎么理解WIN7游戏兼容性没有VISTA好的?
itbeta 发表于 2012-1-23 19:45 | 显示全部楼层
windingway 发表于 2012-1-23 15:44
结论:
1,Win7的内存管理机制战斗力较强
2,使用第三方软件虽然跑分惊人,但却降低了系统的可维护性

仅限于windows 会温到死的  linux内存管理机制不比windows差
luoyu_1980 发表于 2012-1-23 20:30 | 显示全部楼层
我在玩一些老游戏的时候,比如帝国时代,比如Hero3等在win7下面无法正常运行。
经常是画面错误、颜色错误等。

这两个游戏在vista下面就能正常运行。win7下面,运行hero3的时候,我再运行金山游侠的时候,win7下面,金山游侠无法正常运行,具体表现锁定数据就弹出系统,然后就是游戏关闭;在vista下面hero3和金山游侠就能正常配合运行。
很是无奈。
我的笔记本,SL400和E420S分别是vista系统和win7系统。

点评

同用游侠 在win7x64下没有任何问题  发表于 2012-1-24 13:57
不是的,在不用修改器的情况下,帝国2颜色不对,hero3,经常是贴图错误,然后时不时弹出游戏...  发表于 2012-1-23 21:24
不用修改器的话游戏有没问题啊?若没有的话,倒不如说是游侠和WIN7不兼容可能性更大。  发表于 2012-1-23 21:10
kid-man 发表于 2012-1-23 21:22 | 显示全部楼层
文章太高深啊
好多东西都看不动懂
看来有太多东西需要我研究了
zh_555 发表于 2012-1-24 14:57 | 显示全部楼层
学习了,感谢版主
jxflyfly7 发表于 2012-1-24 20:08 | 显示全部楼层
用INTEL TOOLBOX做优化后,记得第一项就是关闭Superfetch缓存预加载技术,那么,如果是SSD配6G以上大内存,是打开还是关闭Superfetch缓存预加载技术?笔记本系统是WIN7 X64
jeffxl  楼主| 发表于 2012-1-24 20:08 | 显示全部楼层
本帖最后由 jeffxl 于 2012-1-24 20:10 编辑
jxflyfly7 发表于 2012-1-24 20:08
用INTEL TOOLBOX做优化后,记得第一项就是关闭Superfetch缓存预加载技术,那么,如果是SSD配6G以上大内存, ...


我认为没有任何影响,缓存的填充对于SSD来说是非常小的负载了。而且内存的IOPS能力较好,缓存命中的话,有一些些提升,只是不明显了(因为SSD的关系)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部