本帖最后由 jeffxl 于 2012-4-26 03:41 编辑
yanleiberg 发表于 2012-4-26 01:58
我之所以弃用ramdisk之类的内存虚拟硬盘软件,主要有两个原因。
一就是我有不少系统级的软件,系统启动时 ...
NT6的动态缓存和IO压力直接相关。如果你是典型家用(家用的IO空闲太多),那么动态缓存经常会被回收到“空闲”值随时给冷加载的前台应用使用,提供最大的冷加载响应效率(无需临时回收缓存给应用申请,直接就有“空闲”内存待用)
如果是重IO负荷,比如你正好在运行高IO压力的应用(典型家用实在算不上什么高IO),那么当你需要IO响应能力时,NT6会最大能力的调配所有“空闲”内存来缓存所有热数据,这个时候“空闲”内存甚至一直保持在0的程度(你有多少内存也全部被拿来增强IO响应能力)。
举例,我使用WIN2008 R2 DC版做无盘+游戏服务器时,“空闲”内存几乎永远是0。所有需要的无盘客户端IO请求被最大限度的缓存到RAM中。
这里的NT6核心的动态缓存中表述的“空闲”内存不等于“可用”内存。可用内存还是由总RAM容量减去本地应用提交的PF使用值,也是随时可用的。高IO负载时可能“空闲”值保持为0,提供最大的IO响应能力,但是如果正好比如这服务器端需要运行或新开启一个服务器本地应用,那么需要回收部分缓存内容来增加“空闲”容量,并立即给你的本地应用使用,本地应用能使用的最大值其实还是“可用”容量。而这个部分并不在PF使用率当中表现,所以你不会看到所谓系统帮助你“撑满”超过50%的内存占用。
动态缓存对用户是透明的,缓存占用的多寡并不影响本地应用的内存使用提交。NT6的缓存逻辑策略其实适用性比较广泛,包括服务器版操作系统也相当的受益(明显比家用效能好很多)。
所以你看起来家用“空闲”容量有很多,那是因为操作系统认为按最有利策略需要的热数据都已经被缓存能够命中并且已经缓存。对家用来说,大部分IO里面,这个压力不容易满足NT6动态缓存的某个“阀值”,一直去拿“空闲”内存去当缓存填充,对于家用来说得不偿失,毕竟客户端应用多会经常启动应用,随时需要新的“空闲”容量来保证立即能够有“空闲”内存资源随时可以启动应用,而不需要经常去回收动态缓存去调配给本地应用(这个必须有性能开销)。
区别就在文件服务器是重IO访问型的数据模型,而家用是N多经常需要启动的前台本地应用+部分缓存支持软件的二次“热”加载或提供已经的IO二次命中。微软提供的某个决断阀值显然同时照顾到了比如家用和IO型服务器型应用,一个统一的策略对两种不同的IO访问模型同时受益,所以NT6体系的系统自带缓存策略,不管对家用还是对服务器都是统一和谐的一个适用性非常好的策略。高IO压力则尽量使用“空闲”资源填充出最大的缓存(几乎是所有可用内存),而家用则因为不满足IO压力阀值要求,则经常留出“空闲”资源待用。
NT6的动态缓存,在你需要响应最大IO能力的时候,系统会自动安排尽可能最大的缓存容量来满足(所有可用内存);而家用类的应用,利用IO压力阀值判决决定出适用的缓存和“空闲”内存占用比
通过各种观察,猜测动态缓存的逻辑是这样的:按时间片来统计IO,在低IO压力时释放掉“当前最不经常使用”的数据缓存。如果你当前的IO流量+数据热度不满足超过数据缓存释放的速率(家用典型IO),那么这时你的缓存容量则开始一直呈递减状态(流入比流出慢),直到仅仅剩下当前“最热”的数据就是你现有的“缓存占用”。如果IO压力加大且这些当前IO数据热度在当前时间片超过缓存命中的阀值,那么则有可能缓存填充热数据的速率比缓存释放冷数据速率快,你会看到“空闲”内存慢慢被消耗,直到变成0 ,达成“可用”内存的最大效能利用。这个过程中还有“可用”内容容量加权递增算法,在以上规则内如果总内存越大,可用越多,那么同比条件下被“缓存”的数据也越多(在低IO压力,“空闲”内存不为0时;高IO压力剩多少都会用光)。
。
|