2010年5月26日 星期三

百萬記錄級MySQL數據庫及Discuz!論壇優化

Discuz MYSQL 數據庫 性能:
最近,幫一個朋友優化一個擁有20萬主題,100萬帖子,3萬多會員,平均在線人數2000人的Discuz!論壇,採用 Linux2.6+Apache2+mod_php5+MySQL5,服務器配置為雙至強+4G內存,優化前,系統平均負載(load average)基本維持在10以上,MySQL的CPU佔用率基本在90%以上,優化後,系統平均負載降到0.5以下,MySQL的CPU佔用率很少有超過10%的時候。優化前YSlow得分只有35分,優化後YSlow得分86分。現將優化的過程和經驗做一個記錄:

首先,對 Apache進行優化,編輯httpd.conf,設置HostnameLookups、KeepAlive、MaxKeepAliveRequests 以及KeepAliveTimeout四個參數,調整MaxSpareServers、ServerLimit、MaxClients以及 MaxRequestsPerChild參數,還可以考慮棄用prefork而採用worker MPM。設置mod_deflate及mod_expires模塊,不過注意Discuz!不能對PHP文件開啟Expires,否則會出現問題。另外還可以考慮開啟mod_cache和mod_mem_cache模塊。另外利用cronolog按天對日誌進行輪循截斷,如果日誌特別大,也可以按小時截斷。另外再加上Awstats對日誌進行分析,並用gzip對日誌進行壓縮,自動刪除1個月前的日誌。

其次,對PHP進行優化,編輯 php.ini,調整output_buffering、zlib.output_compression及max_execution_time、 max_input_time、memory_limit等參數,並安裝Xcache和Zend Optimizer。

然後對MySQL 進行優化。首先重新靜態編譯MySQL,使其只支持MyISAM和Memory兩種引擎,並按Discuz!編碼選擇只支持UTF-8或者GBK字符集。編輯my.cnf,設置skip-locking、skip-external-locking、skip-networking和skip-name- resolve,根據內存和數據庫狀態具體調整key_buffer_size、query_cache_size、 query_cache_limit、max_allowed_packet、table_cache、thread_cache_size、 sort_buffer_size、read_buffer_size、read_rnd_buffer_size、join_buffer_size、 tmp_table_size、max_tmp_tables、back_log、max_connections、wait_timeout的參數。

對數據庫進行優化,將threads和posts表中部分未索引的字段增加索引,並將supersite數據庫表從bbs數據庫獨立出去。修改discuz!配置文件,設置開啟pconnect。

對 Discuz!設置進行優化。進入Discuz!系統設置,修改頁面緩存設置中的緩存有效期和緩存係數,修改服務器優化中的禁止瀏覽器緩衝和頁面Gzip 壓縮,修改防盜鏈設置中下載附件來路檢查,用JSMin自動對js文件進行縮減(Discuz! 6.1的common.js原文件29.3k,經JSMin縮減後為24.1k,再經deflate後為7.3k),修改attachments.php 文件,將:

//dheader(』Cache-control: max-age=31536000′);
//dheader(』Expires: 『.gmdate(』D, d M Y H:i:s', $timestamp + 31536000).』 GMT');

前的註釋去掉。修改模板目錄下adv.htm,去掉與Insenz有關的代碼。

通過查看MySQL的status,可以看出優化後,長時間運行的Key_read_ratio基本保持在0.05%以下,Threads_cache_hitrate保持在99.9%以上。個人感覺,Discuz!將Session保存在數據庫中,極大地降低了 Query Cache的命中率,如果需要進一步優化,可以考慮修改Discuz!源碼,將Session保存到Memcache中。

優化之後用Siege做並發壓力測試,在200並發下,基本沒有任何錯誤。如果將來人數更多,可以考慮將平台遷移到Ngix+PHP FastCGI上。

下面是用Siege在300並發下的測試結果:

#siege -c 300 -b -r 35 -f bbs.url
** SIEGE 2.67
** Preparing 300 concurrent users for battle.
The server is now under siege.. done.
Transactions: 10500 hits
Availability: 100.00 %
Elapsed time: 52.68 secs
Data transferred: 65.67 MB
Response time: 1.27 secs
Transaction rate: 199.32 trans/sec
Throughput: 1.25 MB/sec
Concurrency: 253.07
Successful transactions: 10500
Failed transactions: 0
Longest transaction: 24.88
Shortest transaction: 0.00

500並發下的測試結果:

#siege -c 500 -b -r 20 -f bbs.url
** SIEGE 2.67
** Preparing 300 concurrent users for battle.
The server is now under siege.. done.
Transactions: 9979 hits
Availability: 99.79 %
Elapsed time: 86.52 secs
Data transferred: 82.66 MB
Response time: 3.30 secs
Transaction rate: 115.34 trans/sec
Throughput: 0.96 MB/sec
Concurrency: 381.07
Successful transactions: 9979
Failed transactions: 21
Longest transaction: 34.80
Shortest transaction: 0.00

摘自:http://www.dk101.com/index.php/125562/viewspace-42577.html

沒有留言:

wibiya widget