版权声明:可以在网上任意转载,转载时请务必以超链接形式标明文章原始出处、作者信息及本声明文字。

作者: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

=======

discus mysql 性能_百万纪录级mysql数据库以及discuz!优化相关推荐

  1. mysql 分页_百万数据下mysql分页问题

    点击蓝字关注我们!每天获取最新的编程小知识! 源 / php中文网      源 / www.php.cn 百万数据下mysql分页问题 (查看原文请点击本文末尾左下角: 在开发过程中我们经常会使用分 ...

  2. docker运行mysql性能_使用docker运行mysql

    以前开发的时候都是用本地的sqlite开发,但是极少数情况下,sqlite支持的语法发布到服务器上链接mysql会报错. 为了避免这种现象,还是链接本地mysql开发还是更稳定的, 可是开发的项目多了 ...

  3. Ubuntu MySQL性能_入门系列之在Ubuntu上使用MySQL设置远程数据库优化站点性能

    介绍 随着您的应用程序或网站的增长,您可能已经超出了当前的服务器设置.如果您在同一台计算机上托管Web服务器和数据库后端,最好将这两个功能分开,以便每个功能可以在自己的硬件上运行,并分担响应访问者请求 ...

  4. 提高mysql性能_提升MySQL性能值得借鉴的几个简易方法

    提升MySQL性能的几个简易方法,主要用于设计.开发阶段的借鉴.[@more@]1.Carefully choose attribute types and lengths. 仔细选择字段的类型与长度 ...

  5. loadrunner mysql性能测试_运用Loadrunner测试Mysql数据库性能 TRON•极客

    1.前言 针对数据库的性能测试,loadrunner本身支持sql server和oracle数据库,这两种数据库可以用loadrunner直接录制进行测试.而我们项目中使用的是mysql数据库,针对 ...

  6. 百万记录级MySQL数据库及Discuz!论坛优化

    最近,帮一个朋友优化一个拥有20万主题,100万帖子,3万多会员,平均在线人数2000人的Discuz!论坛,采用Linux2.6+Apache2+mod_php5+MySQL5,服务器配置为双至强+ ...

  7. sysbench mysql测试_用sysbench测试mysql和服务器性能

    关于sysbench测试步骤 关于sysbench调试和安装请参考: http://blog.chinaunix.net/uid-20682026-id-3138466.html 下载地址: [roo ...

  8. 打开和关闭mysql服务器_启动和关闭MySQL服务器

    欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 作为MySQL管理员,一个普通的目标就是确保服务器尽可能地处于运行状态,使得客户机能够随时访问它.但是,有时最好关闭服务器 ...

  9. mysql 生产实践_京东容器化MySQL生产实践

    京东容器数据库系统,MySQL Docker容器实例达到万级以上.架构简单可靠,Docker容器计算平台与MySQL集群管理平台解耦处理.为描述方便,京东容器化数据库系统命名为CM(Container ...

最新文章

  1. python 报错 AttributeError: type object ‘datetime.datetime‘ has no attribute ‘datetime‘
  2. gdb调试fork+exec创建的子进程的方法
  3. .net移动端开发_移动端开发1(前端一)
  4. 【NLP】Prompt-Tuning这么好用?
  5. cent os重置mysql,linux mysql 能登陆不能修改用户(cent os 6.2)解决思路
  6. 【APICloud系列|26】UIScrollPicture 模块(图片轮播)的实现
  7. Pytorch(7)-自己设计神经网络会遇到的问题
  8. 分布式缓存-Memcached
  9. python js返回 json_如何使用 Python 得到网页返回正确的 Json 数据
  10. 特殊用途的IP地址介绍
  11. python透明图片合并_如何使用PIL将透明png图像与另一个图像合并
  12. Redis系列-Redis笔记(一)
  13. flask从表单中的提交中获取数据(不使用第三方库)
  14. android jar包下载地址
  15. 矩阵连乘问题C++实现
  16. CSS练习中|无序列表中,<li>的小黑点如何替换为图片(菜鸡趣味学习,细节到每一步)
  17. angular使用高德地图
  18. 手机卸载不了刷机精灵
  19. 软件测试工程师面经2022-1-22
  20. 短信验证码被盗刷了怎么办?

热门文章

  1. .NET CORE 下收发邮件之 MAILKIT
  2. DaVinci:调整大小
  3. 数据库_EXPLAIN(查询性能优化)
  4. 袁绍说,吾比曹操英勇伟大,因为吾方战死数量远超
  5. 【SDOI2008】山贼集团
  6. 2014 WOT全球软件技术峰会深圳站
  7. iocp端口断开_在完成端口IOCP模型判断客户端是否已关闭连接(掉线) | 学步园
  8. 开课吧项目的总结以及读《图解HTTP》的总结
  9. Android实现在线播放音乐
  10. C/C++二维码生成库qrencode的使用