zoukankan      html  css  js  c++  java
  • 烦人的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的帖子浏览和论坛列表静态化来解决用户浏览速度过慢的问题。
  • 相关阅读:
    poj 2312 Battle City
    poj 2002 Squares
    poj 3641 Pseudoprime numbers
    poj 3580 SuperMemo
    poj 3281 Dining
    poj 3259 Wormholes
    poj 3080 Blue Jeans
    poj 3070 Fibonacci
    poj 2887 Big String
    poj 2631 Roads in the North
  • 原文地址:https://www.cnblogs.com/wuxilin/p/729963.html
Copyright © 2011-2022 走看看