9月 182010
 

最近,帮一个朋友优化一个拥有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

=======

论坛自身优化
很多朋友想象中,对整个论坛系统的效率、负载能力进行优化是很高深的技术。事实上,您仅通过对 Discuz! 自身系统设置合理的配置,就可以实现对速度卓有成效的优化。

由于 Discuz! 是使用数据库的应用程序,因此数据库的大小,具体说也就是帖子数目,会员数目等,都直接影响到各项检索的速度。我们尽最大可能保证整个论坛的速度不因为数据库尺寸的增加而降低,你论坛的帖子在 300 万以内,会员数目在 15 万以内,基本都不会感到速度变慢的情况。我们建议您的帖子数目保持在 500 万以内,会员数目保持在 30 万以内,以使得论坛处于较好的运行状态。

除去帖子和在线人数的因素,您可以尝试从以下几个方面入手优化 Discuz! 的速度:

    1. 在 系统设置 的 Discuz! 选项 中,打开 页面 Gzip 压缩,在支持 Gzip 压缩的 PHP 系统上可以提高页面打开速度数倍
    2. 请打开 基本设置–> Discuz! 选项–> 服务器优化中的 点击数批量更新 功能,这将明显提高系统的负载能力
    3. 请打开 基本设置–> Discuz! 选项–> 页面缓存设置中的 页面缓存 功能,详情请见《页面缓存使用》,这将明显提高系统的负载能力
    4. 如果您常年不更新模板,可将 config。php 中 $tplrefresh 的值置 0 或调大(最大为 9)。这是个专家参数,
       关系到模板更新的时间检查,如果您不完全了解原理,切勿盲从!!!
    5. 定期(如每个月)优化数据表
    6. 选择装有 Zend Performance Suite 的空间商,Zend Performance Suite 是商业软件,由于 Discuz! 是代码
       与数据库并重的论坛产品,该软件可以极为显著的提高 Discuz! 的运行效率。
下面列出几个可能会影响 Discuz! 效率的功能,如果不必要,您可以在系统设置中减小设置值或将其关闭:

    1. 论坛统计功能
    2. 帖子列表显示加点的图标
    3. 过多的(超过初始安装默认数目的 3 倍以上)Smilies 或词语过滤
    4. 过多的(超过初始安装默认数目的 1.5 倍以上)每页显示主题数、帖子数和会员数
注意:鉴于 Discuz! 特别设计的体系结构,可能会和其他论坛产品有所不同。没有列出来的其他功能,我们都认为打开与关闭不会对程序效率产生大的影响,您可放心的使用。

系统优化
对于 MySQL 版本,系统优化主要集中在对 PHP 和 MySQL 的优化上,其中 MySQL 的优化在《MySQL 使用、优化与故障处理》中有详细的介绍。而 PHP 作为一种语言环境,主要是在安装方式上的不同,导致了资源消耗上的不同。

我们建议,对于 Windows 用户,请不要使用 Apache for Windows 作为 web 服务器,而使用微软自带的 IIS。同时,一定不要将 PHP 安装为 CGI 模式(即调用 php.exe 来解析程序),而要将 PHP 安装为 isapi 模式(即调用 php4isapi.dll 来解析程序)。对于 Unix 类用户,使用 Apache+php_apache_module 的方式就可以得到较好的效率。但由于 Apache 自身设计原因,如果您的并发访问数很大,Apache 进程本身就会消耗掉很多的内存,此时可能对数据库的正常缓存造成影响。您也可以考虑换用 Zeus+php_fastcgi 的架构,以获得更高的负载能力。

 回复

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>