PCEVA,PC绝对领域,探寻真正的电脑知识
打印 上一主题 下一主题
开启左侧

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

  [复制链接]
41#
jeffxl  楼主| 发表于 2012-9-27 13:08 | 显示全部楼层
太气人 发表于 2012-9-27 11:20
本不想发言的!!!但看到jeffxl楼主的傻话(误导了一圈人)!!!阿Q精神!!都是一厢情愿的想!!!你做 ...

我是做做网吧相关业务和技术支持、KTV点歌系统技术、宾馆和工业园区弱电系统集成等,我做的事很杂,不知道您认为我对家庭和密集IO环境的内存利和缓存的理解有什么问题。

文章中所有关于个人理解阐述的部分都是经过多年系统集成部署,特别是网吧部署时掌握的经验和规律,而且现在很多软件都可以科学的从各种方面统计缓存效率并从实际商业运营效果反复得到验证的规律。

解除误导也是我写这篇文章的初衷,很多人对大内存利用的理解有偏差,我从我个人工作和学习的经验上做出一定的总结,如有误导或者不妥的部分还请您指出,必将修改。
42#
jeffxl  楼主| 发表于 2012-10-6 20:01 | 显示全部楼层
变心金刚2 发表于 2012-10-6 09:58
说到IO压力,硬盘灯闪烁频繁程度和持续时间是硬道理吧?Win7比会XP少吗?


从操作系统本身来说,相对于XP的后台背景读写,肯定WIN7要多很多,需要实时读写的进程也多不少。

NT6的缓存的意义不是在于避免操作系统本身比如NTFS日志、系统日志之类的读写,这些无论如何延迟写也终将要写入磁盘。这些IO的密度不会变小,在WIN7上肯定也是大于XP没错。

站在全局看用户行为来说,WIN7可以调配所有“未使用”的内存部分来做IO缓存,那么当你做任何用户级别操作时,同样情况下的二次命中率将会比XP高几个数量级。


注意,我们这里并不是考究WIN7和XP的系统自带进程的IO背景读写的流量,这些东西的类型本身也并不容易再次命中,比如写日志类,所以这种IO大了就是大了,也不会因为WIN7的IO缓存大而受益。而且这种你认为“增量”了的额外IO压力对于HDD来说都是小意思而已,而真正需要展现WIN7的IO缓存威力的地方还是必定会体现动态缓存的价值。
43#
jeffxl  楼主| 发表于 2012-10-7 16:06 | 显示全部楼层
本帖最后由 jeffxl 于 2012-10-7 16:16 编辑
变心金刚2 发表于 2012-10-7 11:14
额,目前的硬盘价格和耐用性的口碑……既然你都说Win7的IO要比XP大不少那我想这应该是确实的了。系统本身 ...


您的理解是是错误的,之前我故意把IO分为系统背景IO和用户行为造成的IO不记得吗?

系统IO是比XP多没错,但应用IO的二次命中率会比XP高很多。换句话说,读盘的几率就小很多。而操作系统背景IO那几秒才闪一下硬盘灯的压力其实是可以忽略的。

因为之前您问我关于硬盘灯的闪动频率和磁盘压力相关,问WIN7会比XP少吗?我当然回答的是这个问题,这假设大家啥都不做,都是“待机”看硬盘灯,WIN7必须比XP闪动频率高些。

您开一次机难道一致都在“挂机”?啥都不做?如果是这样,那么XP确实在“IO压力”上更低,更优秀。

一般情况下,用户按需求自然的使用任何软件造成的IO压力都远大于操作系统造成的背景IO。动态缓存对这种需求产生的效益远大于系统背景回写产生的IO压力。

待机时(啥都不做),WIN7是比XP的“静态背景IO”要多不少,因为这些背景读写都是“死回写”不重复(比如日志之类),缓存效益低但是压力也低。待机时非要比IO体验的话,WIN7和XP用户并无体验差别。

基于用户行为,比如跑应用时和真正运行用户需求时,读逻辑的重复率变得相当的高,缓存效益得到非常好的发挥,用户会感觉WIN7的IO体验比XP好很多。
44#
jeffxl  楼主| 发表于 2012-10-7 21:15 | 显示全部楼层
变心金刚2 发表于 2012-10-7 17:59
你认为比如说边QQ边上网听歌浏览网页下载迅雷BT,这时候XP的硬盘灯闪烁时间比Win7要长吗?这符合实际情况 ...

您说的这些东西都没什么全局缓存效益,bt缓存由软件自身定向缓存来降低io。而且这些应全局二次命中不高但持续的低压力io对io能力并不敏感,并不造成体验的区别。
而大量的应用的运行会产生大量的重复度读io,而win7最大可能的利用剩余容量做读io缓存会产生比xp高得多的命中可能,这才是对体验影响最明显的部分。


基于安全的因素,win的默认延迟写是安全导向设计的所以写缓存效益并不高,但是从全局来说win7的读缓存是优秀的
45#
jeffxl  楼主| 发表于 2012-10-7 21:44 | 显示全部楼层
变心金刚2 发表于 2012-10-7 17:59
你认为比如说边QQ边上网听歌浏览网页下载迅雷BT,这时候XP的硬盘灯闪烁时间比Win7要长吗?这符合实际情况 ...


操作系统自带的缓存设计一般都基于命中率和全局有利性原则。

您的预设场景比如QQ、边上网边听歌。您很好的规避了软件的启动过程缓存的作用,这个部分的体验依赖整体IO能力(包含缓存效率),您仅谈这类软件在运行中产生的IO。

       第一,这类应用运行中的IO,比如在线听歌属于网络流媒体。这类媒体数据从网络下行到PC HOST的过程中因为是持续媒体流,相对HOST来说就是媒体流的暂时写入,码率按最大无损音频的要求是1411.2Kbps除以8为170Kbit/S左右的速率持续写入到HOST,根据软件设计的不同,在线流媒体临时缓存可能是在RAM中直接完成流解码,解码后数据即可放弃并更新。按脑残设计,就算是实体写入磁盘系统内,这个码率可能会造成硬盘灯持续闪动,但压力相对于现在的磁盘系统来说相当的低。基于缓存原理,这类数据没有二次命中可能,所以没有缓存效益,但并不影响用户体验。QQ运行中收发用户消息也是如此。这里不符合缓存原理,并且没有有利性、且不影响用户体验。        

      第二,BT类应用。操作系统确实在P2P类应用运行时可以设计无差别的高延迟写或者无限写为目标的写缓存架构,但是违反了全局有利性原则。这伤害了其他软件数据的安全性,这种缓存架构的风险极大。一般推荐由第三方软件设计者为自己的P2P软件自身设计定向缓存,因为这样高级别的延迟写缓存仅专用在此P2P软件的范围内,如果掉电等风险产生的数据损失仅仅控制在P2P软件自身缓存的范围内。换句话说,数据丢失风险的范围仅是你下载的内容。那么,我们来假设您可能需要操作系统全局无差别的高延迟写或无限写缓存,这个时候如果您开机以后产生的写IO也许都或多或少的在系统写缓存上,这些内容也许并没有回写到磁盘,虽然优化了P2P软件的写IO,但是如果此时掉电的话。。。。没有任何人做操作系统架构时仅仅考虑某一种应用的效益而无限增加其他应用的风险。

46#
jeffxl  楼主| 发表于 2012-10-7 21:48 | 显示全部楼层
变心金刚2 发表于 2012-10-7 21:30
呃~大家干得最多的事显不出好来,那有什么用呢?

您说的这些类型IO,谁也做不到缓存优化。因为您说的都是最不利性缓存原则下的“经典”IO类型。而且这类IO一般不影响用户体验。

恰巧需要IO能力的家庭应用,NT6缓存都有很高的效益。试问在没必要、也没办法缓存的IO上动脑筋优化忽略不计的效益有什么用?这和什么操作系统没有任何关系。
47#
jeffxl  楼主| 发表于 2012-10-7 23:03 | 显示全部楼层
变心金刚2 发表于 2012-10-7 22:48
这些不是我个人凭空想象出来的常用应用,确实是大多数人每次开机后做的最多的事,不能在这些应用上显出Wi ...


1、您说的这些没办法缓存
2、假设能缓存也没效益,和体验无关
3、缓存并不用来减少这些IO,这不是缓存的目标,不符合有利性原则。
4、最需要缓存的地方是各种应用的反复资源载入过程,这部分数据量大而且重复率高、大部分时候IO压力大,最影响体验。这部分缓存有最大效益。
5、PC是拿来用的、大部分使用时产生的IO,从总量上来说都为资源载入型。这种既影响IO效能,量又巨大的IO是关键性能指标,其实90%以上的IO数据量在此,而不是那些“本底背景IO”或者流式写入IO。用户的缓存收益面90%在此,你偏要谈那10%不到的IO数据量和毫无体验差异的性能差异。
6、不是说让硬盘灯不闪了,对于用户体验就是最有利的。


48#
jeffxl  楼主| 发表于 2012-10-7 23:09 | 显示全部楼层
本帖最后由 jeffxl 于 2012-10-7 23:13 编辑

缓存并不用来无差别减少磁盘IO读写。
缓存设计目标至少为:
1、无关痛痒可以不缓存
2、不影响体验可以不缓存
3、命中率过低(访问重复性)可以不缓存
4、IO压力大的,可重复再现的IO必须缓存
5、从有利性设计缓存淘汰机制,实现体验最有利化
6、系统自身写缓存安全导向优先。
7、尽最大可能利用所有RAM资源服从命中率原则。

IO压力大的地方,不管是家用还是企业或服务器场合都有很高的可重复性,服务器场合更甚。捡芝麻丢西瓜的设计意图不是一个程序员会做的事。无差别减少磁盘IO不是缓存的设计目的。
49#
jeffxl  楼主| 发表于 2012-10-7 23:35 | 显示全部楼层
实体举例1:
您说的QQ运行时产生的即时IO、在线播放音乐产生的流媒体IO、BT下载产生的IO,这些在理论上无法缓存或不符合全局有利原则。假设能缓存,那么用户体验也是一致的。别人发来个带图信息会让你机器很卡吗?如果能缓存的话不写盘会让你感觉变快了?在线播放音乐的流写入会导致你很卡?然后被缓存延迟了写入你就觉得机器变快了吗?BT软件现在自身都有定向延迟写缓存,有没有系统参与会有体验区别吗?  这些都无关痛痒,不影响体验,这些大部分理论上也无法缓存。用户行为产生的单次HOST下行数据无法预测和预读到缓存,除非他能知道你想做什么而去本地或网络上预读。如果能再次读取就符合命中率原则了,这时如果在缓存命中率排行维护列表中不至于被淘汰(这就是XP和WIN7的区别,WIN7的可缓存容量大,可以维护更长的缓存命中率列表来提高命中),但这又不是你说的那些类型。

实体举例2:
魔兽世界,在内存足够的情况下,假设运行WOW.EXE后还剩余3G内存,对于WIN7来说这3G全部可以用来做资源载入缓存并自动产生效益。如果你某次刷了某个副本读过一次副本蓝条耗时20秒,你今天关机前又在魔兽世界里其他地方转悠,这个过程会积累大量材质资料数据在RAM动态缓存中,因为WIN7的可用缓存是动态未使用的RAM空间,也就是说有3G可用,你2小时后再次访问这个副本有很大的几率此副本的资料载入数据还在动态缓存当中并没有被淘汰(都为可能,但命中可能性比XP大很多,后文详解),此时你进入这个副本需要的材质等资料可以即时从缓存内获取,并不产生或很少产生磁盘读IO就可以完成读蓝条载入副本,耗时假设7秒,那么这就节约了13秒的时间。换成XP场景,虽然同样有3G剩余容量,但XP并没有从最大剩余可用RAM的角度去利用和维护缓存列表,同样的情况下XP载此场景下这个副本的材质资料数据被淘汰出缓存的几率会非常的大,再次访问这个副本是你必须全部重新载入一次这个副本的资料耗时和第一次几乎相同(这里有网络交互误差)。

我虽然不知道XP维护IO缓存的可用阀值是多少,但是从使用经验来看并不是最大化利用RAM可用容量做缓存命中列表的维护,同比场景下的缓存命中率是低过WIN7很多的。

50#
jeffxl  楼主| 发表于 2012-10-7 23:48 | 显示全部楼层
在内存足够的情况下,WIN7会最大可能用剩余RAM的避免重复的资源读取,而XP不是,这就是区别。
51#
jeffxl  楼主| 发表于 2012-10-8 00:21 | 显示全部楼层
变心金刚2 发表于 2012-10-8 00:14
游戏本身可以为XP缓存材质

没懂您的意思。

在内存剩余容量都为一定的情况下,XP在经过长时间IO读写以后,被驻留在IO缓存里的内容经过不断淘汰,因为驻留容量的差距和动态可用性差距,导致WIN7的内存利用率大大优于XP,也就是说您有很多内存没有使用,WIN7会优先帮您全部利用起来作为“IO加速器”最大可能驻留你曾经访问过的数据,按命中率淘汰机制维护缓存列表,驻留容量是动态收益,在需要时能无限接近100%的内存利用率,这些还并不需要您人工维护。这个效益是XP远远不能达成的,这会减少非常多的重复读IO。
52#
jeffxl  楼主| 发表于 2012-10-8 01:31 | 显示全部楼层
本帖最后由 jeffxl 于 2012-10-8 01:57 编辑
变心金刚2 发表于 2012-10-8 00:27
游戏本身已设计可为XP量体裁衣,视其内存大小将可以缩短等待时间的材质等缓存入空闲内存中,而且游戏本身 ...


进程有权利在自己隔离的保护模式内存私有地址下向操作系统申请内存空间,并可以任意使用和载入资源没错,但任何应用包括游戏都不知道下一步需要什么,除非做命中率统计预算和热度实时统计,这些都是操作系统缓存的事(操作系统缓存工作在进程外部,是全局透明的)。而且如果某进程申请额外的空间用来存放本应用的资源,那么这些资源占用的容量就为进程私有占用,对于操作系统来说,它看到的可用内存容量减少了,被这个进程申请了。如果还按你说的游戏知道什么东西需要缓存,而不是基于外部命中率和热度统计的话,进程(应用)是如何猜测我今天会下哪些副本,去哪些地方需要读那些材质?您是如何知道我下一步用户行为要做什么的?我是不是需要把魔兽世界20G的材质都读到RAM里(假设你内存有32G)。如果是这样的话,读入全部WOW材质资源到内存(假设WOW.exe是64位版本,操作系统64位,解除单进程2G内存提交限制)来做进程私有缓存以保证用户到哪里去,内存里都有相关材质。那么操作系统层面会发现,任务管理器WOW.exe这个进程至少需要占用20G的内存私有容量,32G除开20G的WOW.exe的内存占用还剩12G,加上1G左右的系统本身还有杂项的占用,其他应用和操作系统可分配的剩余内存还有11G。我可以这样说,这20G的材质调用有90%是浪费的。操作系统白白浪费了十几G内存用来保证您任何时候都可以直接从内存读到某个地图的材质,其实您本次游戏一共需要的材质可能就3G而已。

任何进程只能访问且只能访问和使用自己申请到的地址,并在保护模式下可私有性的调配这些资源,这些资源被这些进程独占且隔离,只要您提交了请求,一般情况下操作系统再也无法过问和干涉你拿他干什么去了。一般的程序员设计应用时不会考虑我什么时候才读到某个资源,那是系统缓存考虑的事情,在更高的层级发挥效益。软件设计师很多时候无法也不能预计资料载入请求的分布,这个和用户行为还有软件运行规律有非常大的关系。某些定向的应用设计确实可以在进程私有地址常驻资源,那么这些资源必然是程序员可以预计在逻辑上是必须的资源,时时都在且可能要访问。您说的游戏材质载入不属于这种情况,游戏引擎无法预判您要到游戏世界中的哪里去。

任何软件都不知道系统缓存的存在,操作系统缓存的作用是全局的且对应用是透明的,这在高于应用软件的层级产生效益,且不影响整体可用内存的分配,是动态可用的效益。
53#
jeffxl  楼主| 发表于 2012-10-8 01:35 | 显示全部楼层
本帖最后由 jeffxl 于 2012-10-8 01:58 编辑
变心金刚2 发表于 2012-10-8 00:27
游戏本身已设计可为XP量体裁衣,视其内存大小将可以缩短等待时间的材质等缓存入空闲内存中,而且游戏本身 ...


您猜想应用可能会知道下一次将要读什么的理论就算成立,占用的也是自己的进程私有空间,这大大增加的程序的内存占用,降低了操作系统的内存管理效率,白白的浪费了内存做了没有意义的事情。


类似这种事情,只有系统缓存(对于应用是外部透明的)才有最大效益,系统缓存的申请(由系统按热度自动动态管理)并不影响剩余内存可被进程占用的容量,是动态可用容量。而且只有基于命中率统计和热度统计的算法才有最大效益,无法预判用户未知行为产生的读IO并预读RAM。就算能预读也需要用户行为长期判定和统计做用户长期行为预读列表,这是WIN7另一个功能在起的作用,叫做Win7 SuperFetch 超级预读。
54#
jeffxl  楼主| 发表于 2012-10-8 01:57 | 显示全部楼层
本帖最后由 jeffxl 于 2012-10-8 02:01 编辑

一般情况下,譬如WOW.exe的材质载入IO逻辑是这样的:
常规情况下(效果全开),WOW.exe大概占用800M---1.5G内存,这个进程并不常驻太多材质数据,大部分数据需要时从DATA文件夹材质库实时读取,进程本身并不知道外部有没有缓存,一概认为是从磁盘实体IO读取。

对于WIN7操作系统看到的是这样的:WOW.exe假设此时占用1G内存,PC有4G内存,WIN7 64位旗舰加杂项占用1G内存,还剩余2G系统可用来在外部做全局动态缓存使用。这2G不仅仅为WOW.exe服务,但是作为前台应用,WOW.exe进程申请IO访问的频率肯定是最高的,操作系统此时会“非常关注”WOW.exe进程产生的IO。因为基于热度统计,此时WOW.exe进程在游戏时产生大量重复的资源读取请求会被系统捕获并做热度统计,必然超越其他所有进程而获得更高的资源缓存优先级(这些都是自动且透明的)。

这时WOW应用看到的:WOW.exe进程因为玩家穿梭在各大地图和副本,总在请求资源载入,一般只保留当前角色所在的材质资源作为当前即时演算并显示在屏幕上所用。其他材质资源为了进程资源占用最优化,一概在角色离开某地后放弃那些材质资源。WOW进程每次发起的读IO请求都是标准的操作,对进程来说不存在是从缓存中直接命中还是从磁盘上读取的,WOW进程不关心这些,也并不知道。

此时操作系统会做的IO分配操作:WOW进程经常会访问一些材质,特别是这次游戏中角色经常去的地方,基于热度统计原理,这些内容会被缓存维护列表“特殊照顾”,利用所有没有使用的RAM容量做这些材质的缓存操作(这是缓存既定算法,无需人工干预),系统其实并不知道他缓存的是啥,因为他不需要关心,他只知道WOW进程经常在调用这些东西,那么他就把这些资源的缓存优先级提高,在淘汰算法中这些资源甚至都热到无法淘汰出缓存维护列表(因为是前台游戏进程,IO和访问集中度比其他进程高是非常正常的),那么系统相当于常驻了这些资源。站在操作系统全局上看所有进程占用,虽然拿所有剩余内存容量最大可能(还是自动且透明的)缓存了尽可能多的游戏材质数据,但WOW.exe的内存占用还是1G左右。

其他应用软件看到的:这个时候,虽然WOW占1G 系统和杂项占1G内存,4G内存剩的2G由系统缓存动态调配被WOW占用了不少用来维护材质读取IO能在WOW进程需要时(WOW进程还是不知道是从哪读到的,一概认为是从磁盘读取的)直接从缓存命中,这样就欺骗了WOW进程,而读取某材质的速率是内存的速率。但其他软件还是认为操作系统可用内存容量为2G可用。为什么?因为作为系统缓存部分做了动态规划,从优先级上更服从于应用本身的进程占用。如果正好某应用比如你需要WOW双开,你切换出去又执行了一个WOW进程进入游戏又占需要占用1G内存容量,那么系统可以随时让出或者叫做释放部分缓存内容服务于前台进程,这时并不影响其他进程继续申请内存,直到真实可用的未使用内存被占用干净,这时还可以使用申请内存,系统会调配虚拟内存来响应需要的进程呢。

什么是效益最大化,任何服务于进程私有的资源载入占用如非必要都是自私的程序设计,这影响了系统整体效益的发挥,什么时候可能载入什么东西不是程序设计需要考虑的问题,拿内存空间的占用换IO效益是非常愚蠢的做法。你无论如何设计也不会有操作系统动态缓存并全局动态分配有效益。
55#
jeffxl  楼主| 发表于 2012-10-8 03:35 | 显示全部楼层
变心金刚2 发表于 2012-10-8 02:57
游戏为什么要预测游戏角色将要去哪儿?这一个你所处区域内你能进的区域能最快退回的区域当然是游戏程序已 ...

是你自己说的“而且游戏本身才最了解该缓存哪些更有效率” ,你其他的我还没看懂,我慢慢看先
56#
jeffxl  楼主| 发表于 2012-10-8 03:37 | 显示全部楼层
本帖最后由 jeffxl 于 2012-10-8 05:29 编辑
变心金刚2 发表于 2012-10-8 02:57
游戏为什么要预测游戏角色将要去哪儿?这一个你所处区域内你能进的区域能最快退回的区域当然是游戏程序已 ...


您没有懂得什么是热数据统计,热数据不存在丢弃一说,丢弃的只是相对的冷数据。也不存在多少容量都不够的说法,对于WIN7是剩多少内存则有可能利用多少(还要看你IO压力),热统计就是寻找最大重复IO可能性的算法,是基于数据IO在一定时间线上的“经验统计”。经过时间的积累后多次读取的数据自然就不会缓存扔掉,从概率学上来说,您下次更有可能再次访问这些数据。

你说的这些东西,仅需要系统全局缓存即可,热统计和命中率是唯一指标,操作系统甚至无需关心缓存中的内容是什么东西,一概按热度排列缓存优先级并淘汰相对冷的数据,这甚至和剩余内存容量的大小无关(不存在需要多少容量缓存多少内容的说法),按规则办事即可,剩余内存大效益更大而已。仅一条,利用有限的剩余资源造成最大的IO效益是唯一原则。

其实仅需要从IO层面判断那些是热数据,系统层面不需要关心关心角色移动规律,用最简单的判断方式寻求最大效益。您说的游戏进程按角色可能的行进规则预读数据并不是缓存一种方式,这个缓存并没有任何冲突,WOW在大地图上是无缝地图,本来就一直在预读周边很广泛范围的材质。

命中够高才有效益,不是由游戏进程能够决定和猜测的。
57#
jeffxl  楼主| 发表于 2012-10-8 04:35 | 显示全部楼层
本帖最后由 jeffxl 于 2012-10-8 05:07 编辑
jeffxl 发表于 2012-10-8 03:35
是你自己说的“而且游戏本身才最了解该缓存哪些更有效率” ,你其他的我还没看懂,我慢慢看先 ...


反过来我想您提问一下:
如果2小时前我进过4个副本3个战场(其实战场也是副本的一种),按您的说法,是如何判断我下一步可能会进哪个副本?如何才能避免我下一次进入这些副本的IO读需求最低?现在的魔兽世界,能够在任意地点排进任何副本,这些都为游戏中可能的行进最短路线,你甚至不需要移动就可以排进你想排的副本,游戏引擎是不是需要在进程内“缓存或预读”所有副本资料?

按进程自保留和统计数据热度的理论,玩几个小时我需要保留大量数据在进程当中,譬如5小时从进程流过的材质数据可能有5G。进程需要继续申请到5G内存需求来保存这些东西吗?如果进程提交了内存申请,系统少了5G资源,如果只有8G内存,系统用1G,其他应用还有提交内存请求的余地吗?如果我需要这时需要3开魔兽呢(8G可以3开魔兽)?

退一步说,大部分常用用户进程目前都为32位进程,很多应用自己进程运算使用就需要不少了,甚至接近2G极限了,如何在进程里再去做私有缓存去运用其中?而且这是真私有,你进程用了,其他进程就不可用这些容量。一般的游戏只保留当前即时演算需要的材质,魔兽世界在大地图上有角色周边资源预读效益是特殊情况,为的是照顾的是无缝地图的IO体验(这当时可能是游戏业界首例无缝大地图)。


其实您最后谈到的问题都是基于用户行为模式的预读,并不是缓存机制了。预读并没有缓存靠谱,预测用户行为经常会失败,而热数据统计或命中率原则属于时间线上本次开机已经发生过的用户访问经验规律统计,在通过一定时间(时间越长几率越大)的命中率学习后,如果剩余内存容量是足够的,命中率倾向都是无限在提高(仅缓存容量受限);内存容量有限的情况下,内存复用率无限提高。
58#
jeffxl  楼主| 发表于 2012-10-8 04:48 | 显示全部楼层
本帖最后由 jeffxl 于 2012-10-8 05:16 编辑

操作系统热缓存仅仅是数据缓存,操作系统认为那只是一些热度高的IO数据,不关心数据内容。如果进程下次访问同样数据时,向磁盘请求某个LBA地址的IO读请求,操作系统拦截到进程这个请求后先查询是否为缓存热数据,如果是的话,直接拦截请求从缓存中把数据发给进程使用。您角色经常去的地方,甚至只要是去过的地方(如果剩余内存够大)需要的材质数据都会按照热度排列加权计算,效益一定是最高且资源利用合理的,此效益的产生并不影响剩余内存的继续使用(比如又开软件,其他进程又需要内存)。

其实这里只有经常用的数据和不经常用的数据而已,操作系统的判断依据仅是热度,这对IO压力分散就已经足够了。不需要动用游戏进程内的用户行为预测或者判断周边的行进路线可能性那么复杂的东西,而且效果也没有缓存系统做得效率高。要读的数据你总是要读的,只要你读,系统就可以统计出热度(这是全局热度,对所有进程产生的IO平均加权),而且对所有应用一视同仁,共享缓存资源(WIN7上是所有未使用的内存)。非常简单的方式最大可能的减缓磁盘IO效能问题,把IO重复访问产生不必要IO压力这个问题的复杂度一次性留在操作系统设计时考虑,不需要软件设计师每设计一个软件都考虑自身读需求分布和判定将来可能读到什么,如果是这样就把复杂度扩散到每个应用了,这增加了每个程序的逻辑复杂度而且还是共同的复杂度。单一化基于操作系统的IO压力分散方案,譬如动态缓存是本地执行效率和整个IT行业软件IO效率最有利的统一解决方案。

特殊行业,譬如网吧无盘镜像的缓存这类。定向的、基于进程内部的私有缓存这时的效能是比系统自带缓存高不少的,这是特殊情况。和资源访问范围有关,范围集中、访问分布集中且可控,那么可以启用这类应用的私有缓存架构。在无盘软件上这种私有缓存是基于后台服务的(你可以看做是进程的一种)。

某些游戏中的CONFIG文件可能有类似的材质缓存(进程本地调配的)可调设置,那些缓存仅关心游戏逻辑中程序员可预计的极高热度甚至是必然需要的逻辑材质需求缓存,可能IO密度高但总量非常低(仅仅最最常用的通用材质或者游戏资料),大部分游戏材质或资料载入的IO压力分散还是依赖的系统缓存
59#
jeffxl  楼主| 发表于 2012-10-8 06:18 发自PCEVA移动客户端 | 显示全部楼层
本帖最后由 jeffxl 于 2012-10-8 06:25 编辑

实例:网吧游戏服务器使用10g的内存对1000g的游戏做热数据模型的缓存,仅经过一天的热统计学习,访问命中率就超过90%甚至95%以上。您要知道这是网吧针对所有1000g数据的热统计1天造成的结果。1天也许产生了5T的数据请求,实际的磁盘IO只需求了可能不到500M。
同样是游戏,这么多游戏只消耗10g固定的内存产生抵消90%以上磁盘IO的效益,您就可以知道一般用户的游戏IO访问重复性有多高了

其实wow这样的游戏 最热也就是最常读取的数据不会超过2g 4g内存的机器运行wow有相当大的几率在当次pc关机前游戏数据被系统缓存大量二次命中。这会极大的提高游戏体验。同样的环境,xp的命中率会低得多,剩余大量内存它也不见得会去利用
60#
jeffxl  楼主| 发表于 2012-10-8 13:27 | 显示全部楼层
你再好好想想吧。我没言语

去学习一下什么是缓存,你还没有懂。

热数据统计也不是你想象的那么呆板,统计是“经验积累的”的,通过IO读取频率做记录,是长期积累并统计IO次数频率总和做优先级列表维护,符合概率学原理。

你谈的都不符合可操作性原则,纰漏太多,不可能被业界执行。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部