更换 Discuz的内存缓存

2014年5月6日 分类: Discuz, PHP (511 个脚步)

最近论坛一直在卡,负载经常跑到130%,正常情况下负载到10%已经是非常高的了。

追查日志又不能发现什么大的问题,只能临时性的屏蔽抓取大量网页的ip和ua

但是最终还不是个办法。

最后实在受不了了,直接装了一个newrelic来追踪问题。

装上后就发现问题了,如图:

memcache的执行时间居然比读取数据库的都要长…很无语

只能切换到APC,然后负载一下子就降下来了。

排查之下也许跟我们修改Discuz用户过期的时候使用了memcache,然后大概300万用户每次刷新的时候都会读取一遍,大量并发导致的。

memcache 比较老了,对某些东西不太支持。所以我们就将discuz改造成支持memcached。

因为memcached跟memcache的配置都是一样的,所以配置就不用改了。

首先打开/source/class/class_memcache.php

    function init($config) {
        if(!empty($config['server'])) {
            if(class_exists('Memcached')){
                $this->obj = new Memcached;
                $connect = $this->obj->addServer($config['server'], $config['port']);
            } else {
                $this->obj = new Memcache;
                if($config['pconnect']) {
                    $connect = @$this->obj->pconnect($config['server'], $config['port']);
                } else {
                    $connect = @$this->obj->connect($config['server'], $config['port']);
                }
            }
            $this->enable = $connect ? true : false;
        }
    }

优先使用memcached,如果没有memcached就会使用memcache

这还没完事,因为memcached跟memcache的set函数不太一样,还得修改他们。

    function set($key, $value, $ttl = 0) {
        if(class_exists('Memcached')) {
            return $this->obj->set($key, $value, $ttl);
        } else {
            return $this->obj->set($key, $value, MEMCACHE_COMPRESSED, $ttl);
        }
        
    }

嗯,这就完事了,去配置文件切换会memcached,一切都正常了。

下图是使用APC跟memcached的对比,还是用memcached的效率比较高

瓶颈就只是在网络传输了

更换 Discuz的内存缓存 【声明】本文 更换 Discuz的内存缓存 为柠之漠然原创文章,转载请注明出自 枫之落叶
并保留本文有效链接:https://blog.shiniv.com/2014/05/discuz-memcache-memcached/ , 转载请保留本声明!

标签: , , , , ,
1条评论
  • ln

    赵云伟女汉子。。。专业啊

你必须要启用 Javascript