作者:shunz,出处:http://shunz.net/2008/06/mysql_discuz_.html
最近,帮一个朋友优化一个拥有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
作者shunz (http://shunz.net),原文地址: http://shunz.net/2008/06/mysql_discuz_.html

m2014-architecture-webserver->百万记录级mysql数据库及Discuz!论坛优化的更多相关文章

  1. 千万级MySQL数据库建立索引,提高性能的秘诀

    实践中如何优化MySQL 实践中,MySQL的优化主要涉及SQL语句及索引的优化.数据表结构的优化.系统配置的优化和硬件的优化四个方面,如下图所示: SQL语句及索引的优化 SQL语句的优化 SQL语 ...

  2. mysql数据库架构设计与优化

    mysql数据库架构设计与优化 2019-04-23 20:51:20 无畏D尘埃 阅读数 179  收藏 更多 分类专栏: MySQL   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA ...

  3. MySQL数据库基础知识及优化

    MySQL数据库基础知识及优化必会的知识点,你掌握了多少? 推荐阅读: 这些必会的计算机网络知识点你都掌握了吗 关于数据库事务和锁的必会知识点,你掌握了多少? 关于数据库索引,必须掌握的知识点 目录 ...

  4. Mysql数据库写入数据速度优化

    Mysql数据库写入数据速度优化 1)innodb_flush_log_at_trx_commit 默认值为1:设置为0,可以提高写入速度.  值为0:提升写入速度,但是安全方面较差,mysql服务器 ...

  5. 使用log4net无法将日志记录插入mysql数据库解决办法

    写在前面 今天没事研究了下,将日志文件写入mysql数据库,因为新公司用的数据库也是mysql,项目中需要将日志信息写入数据库,没办法,就研究了下.在使用过程中遇到一个很蛋疼的问题.最后解决了,郁闷了 ...

  6. mysql数据库开发常见问题及优化

    mysql 数据库是被广泛应用的关系型数据库,其体积小.支持多处理器.开源并免费的特性使其在 Internet 中小型网站中的使用率尤其高.在使用 mysql 的过程中不规范的 SQL 编写.非最优的 ...

  7. MySQL优化技巧之四:mysql数据库开发常见问题及优化[转]

    mysql 数据库是被广泛应用的关系型数据库,其体积小.支持多处理器.开源并免费的特性使其在 Internet 中小型网站中的使用率尤其高.在使用 mysql 的过程中不规范的 SQL 编写.非最优的 ...

  8. mysql数据库重点(基础优化)

    ### Mysql性能优化 尽量不要写select * ,如果需要全表数据,使用select 加所有字段列名称查询代替* 尽量减少字段列的数学计算,如:where num * 2 >= 30,可 ...

  9. MySQL数据库在IO性能优化方面的设置选择(硬件)

    提起MySQL数据库在硬件方面的优化无非是CPU.内存和IO.下面我们着重梳理一下关于磁盘I/O方面的优化. 1.磁盘冗余阵列RAID RAID(Redundant Array of Inexpens ...

随机推荐

  1. 通过SiteMapDataSource动态获取SiteMap文件进行权限设置

    最近做一个用ASP.NET做一个小项目,用户不是很多,功能不算太复杂,但是做到权限控制的时候有点犯难,这么一个小系统如果全部做一个大的复杂的权限控制觉得成本不划算,打算用Treeview ,根据不同的 ...

  2. Linux 进程间通信(posix消息队列 简单)实例

    Linux 进程间通信(posix消息队列 简单)实例 详情见: http://www.linuxidc.com/Linux/2011-10/44828.htm 编译: gcc -o consumer ...

  3. JavaScript 深入理解作用域链

    第一步. 定义后:每个已定义函数,都有一个内在属性[scope],其对应一个对象的列表,列表中的对象仅能内部访问. 例如:建立一个全局函数A,那么A的[Scope]内部属性中只包含一个全局对象(Glo ...

  4. 实现对div的显示隐藏

    jQuery对div的显示和隐藏: 显示: 复制代码 代码如下:$("#id").show() 隐藏: 复制代码 代码如下: $("#id").show() j ...

  5. js学习笔记20----addClass,removeClass函数封装

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. 如何修复U盘提示被写保护的问题

    最近一客户来店里说新买的U盘没用多久,在复制文件时提示:该磁盘已被写保护! 打不开U盘,并且也不能格式化,在DOS下重新给U盘分区也没用. 今天鼎盛电脑科技服务部的工程师就帮大家解决这个问题. 首先客 ...

  7. centos 部署 SparkR

    ---恢复内容开始--- 环境配置—— 操作系统:CentOS 6.5 JDK版本:1.7.0_67 Hadoop集群版本:CDH 5.3.0 安装过程—— 1.(1)安装R yum install ...

  8. Linux之查看文件大小和数目

    1.查看当前文件大小du -sh ./ du [-abcDhHklmsSx] [-L <符号连接>][-X <文件>][--block-size][--exclude=< ...

  9. ROS 教程之 navigation :在 catkin 环境下创建costmap layer plugin

    在做机器人导航的时候,肯定见到过global_costmap和local_costmap.global_costmap是为了全局路径规划服务的,如从这个房间到那个房间该怎么走.local_costma ...

  10. Spring零散所得

    Spring容器中bean的id或name,都可以有多个,且第一个为标识符(Qualifier),其余皆为别名(Alias).所以都可以通过applicationContext.getBean(&qu ...