`

百万记录级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

昨天,将服务器迁移到了Nginx+php-fpm,以下是迁移后测试,相差真的很明显,回头再写Nginx+php-fpm的经验:

[root@bbs ~]# siege -c 300 -r 50 -f bbs.url
** SIEGE 2.67
** Preparing 300 concurrent users for battle.
The server is now under siege.. done.
Transactions: 15000 hits
Availability: 100.00 %
Elapsed time: 64.12 secs
Data transferred: 67.79 MB
Response time: 0.55 secs
Transaction rate: 233.94 trans/sec
Throughput: 1.06 MB/sec
Concurrency: 128.95
Successful transactions: 14976
Failed transactions: 0
Longest transaction: 3.96
Shortest transaction: 0.00

[root@bbs ~]# siege -c 500 -r 50 -f bbs.url
** SIEGE 2.67
** Preparing 500 concurrent users for battle.
The server is now under siege.. done.
Transactions: 25000 hits
Availability: 100.00 %
Elapsed time: 65.52 secs
Data transferred: 83.65 MB
Response time: 0.57 secs
Transaction rate: 381.56 trans/sec
Throughput: 1.28 MB/sec
Concurrency: 216.02
Successful transactions: 21707
Failed transactions: 0
Longest transaction: 5.83
Shortest transaction: 0.00

分享到:
评论

相关推荐

    discuz!6.1GBK 版本论坛系统

    从创立之初即以提高产品效率为突破口,随着编译模板,语法生成内核,数据缓存和自动更新机制等独创或独有技术的应用,和坚固的数据结构及最少化数据库查询设计,使得 Discuz! 可以在极为繁忙的服务器环境下快速稳定...

    千万级记录的Discuz论坛导致MySQL CPU 100%的优化笔记

    谈到自己在解决一个拥有 60 万条记录的 MySQL 数据库访问时,导致 MySQL CPU 占用 100% 的经过。在解决问题完成优化(optimize)之后,我发现 Discuz 论坛也存在这个问题,当时稍微提了一下

    Discuz! 3.1.2 商业版

    算法及数据结构: 我们始终致力于开发最优化的算法和数据结构,从事 PHP 与 MySQL 的开发的过程中,我们力求每行代码都充分发挥开发工具的效率优势,Discuz! 是一个挑战 PHP 应用极限的应用程序. Discuz! 开发组具有...

    如何使用myisamchk和mysqlcheck工具快速修复损坏的MySQL数据库文件

    如果,出现这样的mysql数据库错误很可能是mysql数据库索引出了问题。那么,什么是mysql数据库索引? 分析:索引如果是primary unique这两两种,那么数据表的数据对应的这个字段就必须保证其每条记录的唯一性。否则就...

    Discuz 2.5 最新版

    产品的现有架构,仅数据库操作相关的架构优化,就涉及317个程序文件的4525处代码片段修改,并新增DB类文件217个。 从Discuz! X2.5起,数据读写层已经实现全面独立封装。新版支持以表为单位的分服务器部署;数据表全面...

    我已装了Mysql但,安装DZ论坛时,为什么提示没有安装Mysql?

    您可能感兴趣的文章:MySQL优化配置文件my.ini(discuz论坛)千万级记录的Discuz论坛导致MySQL CPU 100%的优化笔记由于mysql运行权限导致无法找到 Discuz! 论坛数据表! 的解决方法MySQL针对Discuz论坛程序的基本优化教

    Discuz网页斗地主插件

    Discuz网页斗地主插件V2SP3正式稳定版,消耗会员积分,支持多人联机和X2.5版本! 这是一款能集成到论坛的社交游戏 。 插件特点: 1.可与社区积分数据共享-消耗用户积分(站长可在启动.exe里控制积分消耗数量) 2....

    近乎(Spacebuilder) 5.3 安装版.zip

    5.调整mysql数据库的数据库结构;6.调整脚本中扩展模块积分项的初始化数据;7.升级阿里云短信接口;8.新增租户管理,为开发人员提供方便的可视化的租户管理;9.5.3升级保留5.x版本的所有数据;10.5.3升级调整附件在...

    小鬼当家音乐系统iShowMusic v1.2 Build 0610.rar

    程序采用文本数据存储方式,无需MYSQL数据库支持,同时程序代码与界面模板分离,方便网站二次开发及界面修改。 主要功能: 1、音乐二级分类; 2、在线音乐播放; 3、歌词同步显示; 4、音乐下载 5、点歌系统;...

    ecshop商城系统手册

    系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序。 ECShop悉心听取每一位商家的需求与建议,不仅设计了人性化的网店管理系统帮助商家快速上手,还根据中国人的购物习惯改进了购物流程,实现更好的用户...

    B2Bbuilder(B2B电子商务网站) 7.0.1.zip

    可以轻松对网站进行备份,恢复,以及数据库的修改及优化操作 网页生成 用户可以根据需要自己设置一下相关的个性独立页面,灵活创建例如关于我们、联系方式等页面 地图模块 和第三方地图合作,可以自动识别用户...

    商城程序源码

    系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序。 ECShop悉心听取每一位商家的需求与建议,不仅设计了人性化的网店管理系统帮助商家快速上手,还根据中国人的购物习惯改进了购物流程,实现更好的用户购物...

Global site tag (gtag.js) - Google Analytics