admin 发表于 2012-6-13 15:17:26

Discuz X2.5 終於變快

從X1.5開始研究Discuz。覺得Discuz是很好用的CMS。始終把我的網站改成Discuz X2.0 進而升級到Discuz X2.5。是磨練的開始也是美夢的開始。Discuz X2.5 為何慢! 開啟首頁要20 secs. 第2次 refresh 只要 0.023sec.暈!開始思考為何X2.0不會如此慢。一個網站若在5秒內沒開出來是沒法讓大眾接受的。下定決心好好面對換回去X2.0 or 繼續努力?網上搜出很多優化的帖子。伺服器端的優化有:1. Discuz方面優化: 用memcacheeacceleratorapc靜態化都是在系統端優化。 將這4種建議方式安裝後。仍不見成效。2.Mysql 的測試:更換了版本mysql-5.0.45 mysql-5.0.96 mysql-5.1.56mysql-5.1.63mysql-5.5.25.tar.gz
[*]mysql-5.6.2-labs-innodb-memcached.tar.gz
   一樣慢的下場。試著將my.cnf
port         = 3306
socket         = /tmp/mysql.sock
skip-external-locking
skip-name-resolve
key_buffer_size = 128M
max_allowed_packet = 4M
table_open_cache = 256
sort_buffer_size = 4M
net_buffer_length = 64K
read_buffer_size = 2M
read_rnd_buffer_size = 1M
myisam_sort_buffer_size = 16M
log-error=/usr/local/mysql/log/error.log
log=/usr/local/mysql/log/mysql.log
long_query_time=2
log-slow-queries=/usr/local/mysql/log/slowquery.log...../usr/local/mysql/bin/mysqld, Version: 5.5.25-log (Source distribution). started with:
Tcp port: 3306Unix socket: /tmp/mysql.sock
Time               Id Command    Argument
120612 16:12:50   1 Connect   root@127.0.0.1 on
                  1 Query   SET character_set_connection=utf8, character_set_results=utf8, character_set_client=binary,sql_mode=''
                  1 Init DB   my20
                  1 Query   SELECT * FROM pre_common_session WHERE `sid`='8s705S'
                  1 Query   SELECT * FROM pre_common_cron   WHERE available>'0' AND nextrun<='1339488770' ORDER BY nextrun LIMIT 1
                  1 Query   UPDATEpre_common_cron SET `lastrun`='1339488770' , `nextrun`='1339491600' WHERE `cronid`='6'
                  1 Query   SELECT * FROM pre_forum_threadmod WHERE expiration>0 AND expiration<1339488770 AND status=1
                  1 Query   SELECT * FROM pre_common_cron   WHERE available>'0' ORDER BY nextrun LIMIT 1
                  1 Query   REPLACE INTO pre_common_syscache SET `cname`='cronnextrun' , `ctype`='0' , `dateline`='1339488770' , `data`='1339488000'
                  1 Query   SELECT * FROM pre_common_block_item WHERE `bid` IN('320','321','309','317','234','313','279','235','247','308','315','319','246','304','262','249','
                  1 Query   SELECT * FROM pre_common_block WHERE `bid` IN('320','321','309','317','234','313','279','235','247','308','315','319','246','304','262','249','252',
                  1 Query   SELECT * FROM pre_common_block_style WHERE `styleid` IN('134','116','128','113','120','135','119','140','124','125','123','115','141','122','143','1
                  1 Query   UPDATEpre_common_block_item SET `makethumb`='2' WHERE `itemid`='1'
120612 16:13:10   1 Query   UPDATEpre_common_block_item SET `makethumb`='2' WHERE `itemid`='1'
                  1 Query   DELETE FROM pre_common_session WHEREsid='TZ67S8'OR lastactivity<1339487890OR (uid='0' AND ip1='180' AND ip2='168' AND ip3='163' AND ip4='250'
                  1 Query   INSERT INTO pre_common_session SET `sid`='TZ67S8' , `ip1`='180' , `ip2`='168' , `ip3`='163' , `ip4`='250' , `uid`='0' , `username`='' , `groupid`='7
                  1 Query   UPDATEpre_common_block SET `dateline`='1339488770' WHERE `bid`='247'
                  1 Query   SELECT * FROM pre_common_block_item_data WHERE `bid`='247' AND isverified=1 ORDER BY stickgrade DESC, verifiedtime DESC, dataid DESCLIMIT 5
                  1 Query   SELECT at.*, ac.viewnum, ac.commentnum FROM pre_portal_article_title at LEFT JOIN pre_portal_article_count ac ON at.aid=ac.aid WHERE at.status='0' O
                  1 Query   SELECT * FROM pre_common_block_item WHERE `bid`='247' ORDER BY displayorder, itemtype DESC
                  1 Quit
                  2 Connect   root@127.0.0.1 on
                  2 Query   SET character_set_connection=utf8, character_set_results=utf8, character_set_client=binary,sql_mode=''
                  2 Init DB   my20
                  2 Query   SELECT * FROM pre_common_session WHERE `sid`='TZ67S8'
                  2 Query   SELECT * FROM pre_common_cron   WHERE available>'0' AND nextrun<='1339488790' ORDER BY nextrun LIMIT 1
                  2 Query   UPDATEpre_common_cron SET `lastrun`='1339488790' , `nextrun`='1339489800' WHERE `cronid`='15'
                  2 Query   SELECT * FROM pre_common_cron   WHERE available>'0' ORDER BY nextrun LIMIT 1
                  2 Query   REPLACE INTO pre_common_syscache SET `cname`='cronnextrun' , `ctype`='0' , `dateline`='1339488790' , `data`='1339489800'
                  2 Query   SELECT * FROM pre_common_mailcron WHERE sendtime<=1339488790 ORDER BY sendtimeLIMIT 1
                  2 Quit
120612 16:13:11   3 Connect   root@127.0.0.1 on
3.最後想或許問題在IO 就將linux 伺服器劃出1G Ram來模擬 RamDisk 。將 mysqldata 與網站所有程式移到Ramdisk。Ramdisk速度約為Raid0 的10倍速。所有最好環境都用上。仍不見起色。莫非這是天意!本人研究八字八卦風水也20多年,學linux 也14年。我看需要起個卦來問八卦祖師與諸賢聖。還是先靜靜思考問題。決定先用-奇門遁甲的招數。將慢的部分放在後面refresh 一次。在網站前面放個靜態.html. 刷好在跳轉到discuz X2.5。一般User是看不出來。所以會很快。這就是戲法人人會變巧妙各有不同。
---4.還是從根本好好學習 DiscuzX2.5的程式. 安裝了 phpxref-0.7.1.tar.gz後就好好從基礎開始學。 在 /source/class/db/db_driver_mysql.php
...
function _dbconnect($dbhost, $dbuser, $dbpw, $dbcharset, $dbname, $pconnect, $halt = true) {
         <span style="color: DarkOrchid;">echo 'Begin-'.date('Y-m-d H:i:s') .'
';</span>
...
$serverset && mysql_query("SET $serverset", $link);
       $dbname && @mysql_select_db($dbname, $link);
                  <span style="color: Purple;">echo '
'. $dbname. '-'. date('Y-m-d H:i:s');   // exit;</span>
...

public function query($sql, $silent = false, $unbuffered = false) {
                if(defined('DISCUZ_DEBUG') && DISCUZ_DEBUG) {
                        $starttime = microtime(true);
                }

                if('UNBUFFERED' === $silent) {
                        $silent = false;
                        $unbuffered = true;
                } elseif('SILENT' === $silent) {
                        $silent = true;
                        $unbuffered = false;
                }
$func = $unbuffered ? 'mysql_unbuffered_query' : 'mysql_query';
<span style="color: Purple;">echo '
'.date('Y-m-d H:i:s') .' begin-('. $func. ')-'.$sql.'-' ;</span>
if(!($query = $func($sql, $this->curlink))) {
if(in_array($this->errno(), array(2006, 2013)) && substr($silent, 0, 5) != 'RETRY') {
<span style="color: Purple;">echo '
'.date('Y-m-d H:i:s') .' Retry-2006-2013-('. $func. ')-'.$sql.'-' ;</span>

                              $this->connect();
                              return $this->query($sql, 'RETRY'.$silent);
                        }
                        if(!$silent) {
                              $this->halt($this->error(), $this->errno(), $sql);
                        }
                }
                if(defined('DISCUZ_DEBUG') && DISCUZ_DEBUG) {
                  $this->sqldebug[] = array($sql, number_format((microtime(true) - $starttime), 6), debug_backtrace(), $this->curlink);
                }
                $this->querynum++;
                return $query;

---Begin-2012-06-13 02:31:22
ver=5.5.25-log2012-06-13 02:31:22
my20-2012-06-13 02:31:22
2012-06-13 02:31:22 begin-(mysql_query)-SELECT * FROM pre_common_session WHERE `sid`='0yQa1z'-
2012-06-13 02:31:22 begin-(mysql_query)-SELECT * FROM pre_common_cron WHERE available>'0' AND nextrun<='1339554682' ORDER BY nextrun LIMIT 1-
2012-06-13 02:31:22 begin-(mysql_query)-UPDATE pre_common_cron SET `lastrun`='1339554682' , `nextrun`='1339611720' WHERE `cronid`='14'-
2012-06-13 02:31:22 begin-(mysql_query)-SELECT serial FROM pre_common_patch ORDER BY serial DESC LIMIT 1-
2012-06-13 02:31:22 begin-(mysql_query)-UPDATE pre_common_patch SET `status`='1' WHERE `serial`<='25000002'-
2012-06-13 02:31:22 begin-(mysql_query)-SELECT * FROM pre_common_cron WHERE available>'0' ORDER BY nextrun LIMIT 1-
2012-06-13 02:31:22 begin-(mysql_unbuffered_query)-REPLACE INTO pre_common_syscache SET `cname`='cronnextrun' , `ctype`='0' , `dateline`='1339554682' , `data`='1339527600'-
2012-06-13 10:31:22 begin-(mysql_query)-SELECT * FROM pre_common_block_style WHERE `styleid` IN('115')-
2012-06-13 10:31:22 begin-(mysql_query)-SELECT * FROM pre_common_block_item WHERE `bid` IN('246','268')-
2012-06-13 10:31:22 begin-(mysql_query)-SELECT * FROM pre_common_block WHERE `bid` IN('246','268')-
2012-06-13 10:31:22 begin-(mysql_query)-SELECT * FROM pre_common_block_style WHERE `styleid` IN('120')-

2012-06-13 10:31:42 begin-(mysql_query)-UPDATE pre_common_session SET `sid`='0yQa1z' , `ip1`='180' , `ip2`='168' , `ip3`='163' , `ip4`='250' , `uid`='0' , `username`='' , `groupid`='7' , `invisible`='0' , `action`='4' , `lastactivity`='1339554259' , `lastolupdate`='0' , `fid`='0' , `tid`='0' WHERE `sid`='0yQa1z'-
回頂部
2012-06-13 10:31:42 begin-(mysql_query)-UPDATE pre_common_block SET `dateline`='1339554682' WHERE `bid`='261'-
2012-06-13 10:31:42 begin-(mysql_query)-SELECT * FROM pre_common_block_item_data WHERE `bid`='261' AND isverified=1 ORDER BY stickgrade DESC, verifiedtime DESC, dataid DESC LIMIT 1-
2012-06-13 10:31:42 begin-(mysql_query)-SELECT typeid, name, special FROM pre_forum_threadtype WHERE special>'0'-
2012-06-13 10:31:42 begin-(mysql_query)-SELECT * FROM pre_forum_threadclass-
2012-06-13 10:31:42 begin-(mysql_query)-SELECT * FROM pre_forum_threadclass-
2012-06-13 10:31:42 begin-(mysql_query)-SELECT DISTINCT t.* FROM `pre_forum_thread` t WHERE t.readperm='0' AND t.special IN ('1') AND t.isgroup='0' AND t.displayorder>='0' ORDER BY t.lastpost DESC LIMIT 0,1;-

---終於發現第1行時間就錯誤 相差8小時 是時區問題。第16行是慢20secs的關鍵。 初步判斷discuz X2.5 慢跟時區 $this->timezone_set();有關。所以就將所有discuzX2.5 $this->timezone_set($timeoffset); $this->timezone_set(); 全改為 $this->timezone_set(8);所以速度就全靠網速與品質了。 謝天謝地!走了一大圈學習了新技術。往往逆境是突破最好的時機!感恩discuz X2.5 團隊的貢獻。
---
页: [1]
查看完整版本: Discuz X2.5 終於變快