烦人的CommunityServer

CS2.0的在线列表一直就不能正确的显示在线人数,一直很忙也没时间去管,今天越看越郁闷,狠下心花了半天的时间来找问题的究竟
CS的缓存很庞大,在线列表也当然使用了缓存,大致流程是:
用户执行某个页面的浏览
获取了当前用户的状态
SetLocation(),把用户的当前在线状态写入UsersOnline这个类里的哈希表里(会员表或游客表)
在线用户的写入就是上面这些,需要提一下的是,这里面UsersOnline用单件模式来实现唯一性,但是实例对象不是用静态方式存储,而是以Cache方式存起来,这样一来可以遵循整个CS系统的缓存结构,二来缓存的方式也更加强大(依赖条件,Callback函数等)

接下来是在线用户的消去。正常情况下,只有一个途径会从缓存中消去在线用户(这里不存在缓存过期问题,因为上述缓存建立时是永不过期的),这个途径就是通过Jobs来定时执行消去方法。
在CS中,所有定时执行的类叫一个job,从IJob继承,这里负责在线用户消去的类叫做AnonymousUserJob,具体执行的方法是private void CleanUsers(int settingsid),里面包含了Member和Guest的2个消去方法,他们的作用就是从会员表和游客表中除去已经过了n分钟没有执行动作的用户。
CS处理这个问题非常的马虎,直接hard code了2个参数,5和10,意思是,在执行检查时,5分钟没有活动的游客将被除去,10分钟没有活动的会员将被除去。如果你需要修改,你只能在代码里修改这2个值,然后重新编译,强烈建议自己把这2个值存到config里或者是siteSetting里。

后记:
我把这2个值改完之后,更新了程序,发现在线用户显示有时高有时低,特地写了个程序监视Cache,发现Cache隔了很短的时间就被清空了一次,这导致用户列表的Cache被频繁重置,根本无法正确的反映当前用户在线的信息。
这个问题我个人认为是由于CS系统占用服务器内存很大,导致服务器需要频繁回收Cache,使得Cache失效。但是这里也有疑点,我服务器上内存使用一般才700M左右,而IIS的进程池我并没有限定虚拟内存大小,而且缓存时我设定的优先级是aboveNormal,这个即使需要回收也应该是排在很后的。
在我放CS的服务器上同时还放有3个站点程序,我试着新建了个线程池然后把那3个站点都归入新的线程池中,CS独占一个线程池,这时,在线用户信息显示正常了。
这个问题的答案我并不满意,现在还在继续观察服务器的状态,如果有新的可能,我会来这里再公布我的新结论。

CS2.0系统庞杂,本身性能极差,而缓存使用泛滥,颗粒度的控制很糟糕,造成对服务器的压力巨大,有无数次想要重写一个自己满意的论坛,但是一直没有时间和精力,只好在CS上慢慢的修改,但是目前看来,如果不能对整个内核和缓存结构做出重写的话,依然不能解决根本问题。现在唯一的解决方法是静态化,把CS的帖子浏览和论坛列表静态化来解决用户浏览速度过慢的问题。

posted on 2007-04-27 16:24  wiseman  阅读(523)  评论(0编辑  收藏  举报

导航