`

百万记录级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!NT 2.1论坛数据库

    NT 2.1论坛源代码"是指该论坛系统的编程源代码,通常由PHP编写,与MySQL数据库紧密集成。"此论坛数据库设计方案"则揭示了该论坛系统背后的数据库架构和逻辑,它是整个系统功能实现的基础。数据库设计不仅包括表结构...

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

    在本文中,我们将深入探讨如何优化千万级记录的Discuz论坛以解决MySQL CPU占用100%的问题。Discuz是一款广泛使用的开源社区论坛软件,但随着数据量的增加,未优化的查询可能导致数据库性能急剧下降,进而引发CPU资源...

    discuz2.5数据库详细说明(pdf和word)

    2.5基于MySQL数据库管理系统,遵循关系型数据库设计原则,通过规范化、索引优化等手段确保数据的一致性、完整性和高效访问。它将论坛的各种功能如用户信息、帖子、版块、权限等抽象为多个独立的数据表,形成一个...

    discuz!6.1GBK 版本论坛系统

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

    discuz x2数据库结构

    X2基于MySQL数据库管理系统,因此其数据库结构遵循了SQL规范,具有良好的结构化特性。 二、主要数据表介绍 1. **pre_common_member**:此表存储所有注册用户的详细信息,如用户名、密码、邮箱、注册时间等。密码...

    Discuz!X2数据表结构

    X2的数据库设计基于MySQL,这是一种关系型数据库管理系统,能够处理大量的数据并提供高效稳定的性能。在Discuz!X2中,数据表主要分为以下几个核心部分: 1. **用户模块**:这一部分包含了与用户账户相关的信息,如`...

    超级出名的bbs源码discuz! 5.0的数据库结构信息

    同时,对数据库的优化和调整,如合理设计索引、优化查询语句,能有效提升论坛的性能。 总的来说,掌握Discuz! 5.0的数据库结构信息,无论是对运维人员进行数据备份、恢复,还是对开发者进行功能扩展、插件开发,都...

    Discuz! 倾城论坛

    5. **SEO优化**:为了提高搜索引擎可见性,Discuz! 集成了SEO相关功能,如自定义URL结构、关键词设置、元标签管理等,有助于提升论坛在搜索引擎结果页的排名。 6. **多语言支持**:Discuz! 支持多语言环境,包括...

    Discuz! 3.1.2 商业版

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

    discuz discuz 架构分析

    使用MySQL作为主要数据库,存储各类论坛数据。其数据库设计遵循关系型模型,通过数据表结构化存储信息,如用户表、帖子表、板块表等,保证数据的一致性和完整性。 二、数据库设计 在《discuz!x1[1].5》数据表.doc...

    discuz x1.5数据库结构

    理解这些数据库表的结构和功能对于优化论坛性能、进行数据分析、开发插件或者修复问题都至关重要。然而,由于没有提供具体的值说明,实际操作时还需要结合Discuz! X1.5的官方文档或实际论坛数据进行更深入的学习。...

    Discuz! X3服务器优化设置.docx

    X3服务器优化设置》是一份关于如何提升Discuz! X3论坛系统性能的文档。Discuz! X3是一款广泛使用的社区论坛软件,其性能优化对于保证站点稳定性和用户体验至关重要。以下将详细介绍文档中提到的各项服务器优化设置...

    Discuz!NT使用说明和实例

    - **环境要求**:首先确保服务器或本地环境支持.NET Framework运行环境,通常需要ASP.NET 2.0或更高版本,以及SQL Server或MySQL数据库。 - **下载安装**:从官方获取最新版本的Discuz!NT安装包,解压后上传至...

    Discuz_7.2_UTF8环境.rar

    3. 安装MySQL:创建一个新的数据库和用户,分配相应的权限,为Discuz!7.2提供数据存储空间。 4. 配置discuz源码:将“upload”目录下的所有文件上传至Web服务器的根目录或者指定的子目录下,根据“readme”文件的...

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

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

    使用Discuz!后台备份和恢复Discuz!站点数据库的方法教程

    通过后台登录,站长可以进入“数据库”菜单下的“恢复”选项,从而看到所有备份记录,包括备份时间、备份数据类型等。在恢复之前,站长需要上传一个名为restore.php的文件到程序文件夹的data目录下。这个文件可以在...

    Discuz数据库.txt

    为了确保论坛的稳定运行,Discuz数据库需要定期进行优化和维护。这包括但不限于: - 定期清理过期的缓存信息,减少数据库负担。 - 监控并优化高查询量的SQL语句,提高查询效率。 - 对敏感操作,如删除帖子、封禁用户...

    discuz!插件开发教程

    3. **熟悉MySQL数据库操作**:包括基本的SQL语句及优化技巧。 4. **熟悉Discuz! 文件结构**:了解Discuz! 的文件夹结构及各部分功能对于插件开发至关重要。 #### 三、文件结构介绍 Discuz! 的文件结构非常清晰,...

    discuz7.1的数据结构分析

    是一款非常流行的社区论坛软件,由Comsenz公司开发,采用PHP语言和MySQL数据库构建,为用户提供了一个功能强大且易于定制的在线交流平台。对于希望进行二次开发的技术人员而言,深入理解其数据结构是至关重要的。...

Global site tag (gtag.js) - Google Analytics