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的帖子浏览和论坛列表静态化来解决用户浏览速度过慢的问题。
  • 相关阅读:
    类的继承,抽象类和接口
    什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI?
    php 中 SERVER 服务器参数
    数组与对象互换方法
    php实现二维数组查找功能【array_search 和 array_column】
    php基础知识点列表【2020年10月7日】
    json_encode 中文及特殊斜杆的编码
    吴裕雄--天生自然ANDROID开发学习:2.5.8 Notification(状态栏通知)详解
    吴裕雄--天生自然ANDROID开发学习:2.5.7 Toast(吐司)的基本使用
    吴裕雄--天生自然ANDROID开发学习:2.5.6 ViewFlipper(翻转视图)的基本使用
  • 原文地址:https://www.cnblogs.com/wuxilin/p/729963.html
Copyright © 2011-2022 走看看