本帖最后由 jeffxl 于 2012-10-8 13:56 编辑
变心金刚2 发表于 2012-10-8 11:15
系统怎么知道游戏中的那些数据将会成为热数据?游戏的所谓“经常读取的热数据”是没有标准的也没有时间范 ...
这是一家50台机器的小型网吧,游戏大概在500G,服务器16G内存,2G用来缓存无盘镜像,11G用来缓存游戏内容(命中率91%),全部为热统计模型下的缓存,基于命中率算法。
其中游戏有162个,每天络绎不绝的玩家会玩不同的游戏,其中只有9%是未命中从磁盘读取,其他平均91%的IO全部从内存直接并发。
按您说的,服务器是怎么知道整个网吧的玩家玩的什么游戏?某游戏中某玩家会干什么?
我说了至少5次了,任何建立在热统计下的缓存都是透明缓存,对应用对用户透明,用户感觉不到他存在,应用也是,缓存不关心数据内容是什么,那只是一些经常访问的0和1而已,判定逻辑甚至可以不在用户端,只关心数据在哪发生IO。你说现在读5次的IO地址后面就不读了?很简单,很快这些数据会被淘汰,在计数统计中会被其他数据超越,永远缓存您最可能访问的数据。随着时间的流逝,这种命中率无限提高的倾向越来越大,因为您说的突然读5次以后不读的现象在相当长的一段时间片内趋向于忽略不计,你以后不读这数据,那么他的计数就是5次,5次IO对于一个经过时间"学习命中率"后的缓存热度列表可以忽略不计,譬如1天内,早有其他IO被读取几万次了,服务器从缓存维护列表中根本不会鸟那突然读的5次以后就不读了的问题,不会去缓存他。
想通了吗?不存在缓存了啥就浪费了什么几G空间问题,缓存是被动检测并驻留数据,所有被缓存的数据都是您曾经的有效IO请求,如果出现次数高,就会在某次再出现时被缓存直接指挥驻留到RAM中,并不需要主动去“缓存”。您还在混淆预读和缓存的概念。 |