百万记录级MySQL数据库及Discuz!论坛优化
最近,幫一個朋友優化一個擁有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
=======
轉載于:https://www.cnblogs.com/yongzhi/articles/1233480.html
總結
以上是生活随笔為你收集整理的百万记录级MySQL数据库及Discuz!论坛优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: p沟道mos管导通条件_场效应管(MOS
- 下一篇: hosts ip 指向ip_【好玩的网络