欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Drupal性能优化相关模块,Memcache

Drupal性能优化相关模块,Memcache

2012-11-19  sslit   阅 658  转 2

drupal性能问题一直以来都是Drupaler们最大的难题,在平台设计方面,可扩展性和高性能从来都是难以平衡的问题。
drupal平台本身的优劣本文不做讨论,就drupal的性能问题,这里列几个实战总结经验,以供参考。

1. 使用静态页面缓存(Boost模块)
静态页面是最快的,没有之一!
因此静态页面缓存是最佳选择,尽量把页面动态的部分独立处理,用ajax/iframe调用,整个页面是静态页面,部分用ajax刷新(当然用shtml也可以)。 Boost模块经过稍微调整和修改,可以设置某些Roles(比如一般认证用户)也读取静态缓存(apache/nginx的rewrite),并且可以很好的工作在Apache和Nginx上面,并使某些角色,比如管理员,不读取静态页面。对于一个普通网站,90%以上的都属于普通认证用户和匿名用户,因此,经过这样修改可以大大提高性能。

具体如何使用Boost模块已经如何让登录用户也使用Boost模块,可以参考这篇文章,让Drupal/Boost模块发挥到极致
Boost 模块地址 http://drupal.org/project/boost

Ajax建议使用drupal的高效Ajax Callback模块 High-performance JavaScript callback handler

这里给出了nginx的boost设置文件,仅供参考。

10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  ###Nginx-BOOST
  set $boost "";
  set $boost_query "_";
 
  if ( $request_method = GET ) {
    set $boost G;
  }
  if ($http_cookie !~ "DRUPAL_ADMIN") {
    set $boost "${boost}D";
  }
  if ($query_string = "") {
    set $boost "${boost}Q";
  }
  if ( -f $document_root/cache/normal/$http_host$request_uri$boost_query$query_string.html ) {
    set $boost "${boost}F";
  }
  if ($boost = GDQF){
    rewrite ^.*$ /cache/normal/$http_host/$request_uri$boost_query$query_string.html break;
  }
  if ( -f $document_root/cache/perm/$http_host$request_uri$boost_query$query_string.css ) {
    set $boost "${boost}F";
  }
  if ($boost = GDQF){
    rewrite ^.*$ /cache/perm/$http_host/$request_uri$boost_query$query_string.css break;
  }
  if ( -f $document_root/cache/perm/$http_host$request_uri$boost_query$query_string.js ) {
    set $boost "${boost}F";
  }
  if ($boost = GDQF){
    rewrite ^.*$ /cache/perm/$http_host/$request_uri$boost_query$query_string.js break;
  }
  ###END-BOOST

2. opcode
Drupal 需要load相当多的PHP文件,所以opcode是必须的,MUST!
实践证明eAccelerator比APC和xCache好一点,注意:APC的某个版本在NFS环境下有bug,不能正确缓存,所以建议使用eAccelerator。

3. Memcache memcache是LAMP平台居家必备的缓存服务器
最好多个memcache集群使用,Memcache可以使用Drupal的Memcache模块,支持多个集成。

注意:当Memcache不在本机,那么需要占用网络带宽,并且Drupal的缓存数据比较大,比如theme信息,node-type信息等,再每页请求都要加载,这样读取cache的流量就非常大。

比如,每次读取cache 500K,那么1千次访问就需要占用流量500M,这个流量相当不小。建议把这部分不经常修改的cache保存在本机某个cache目录下面,可以把cache目录mount到内存上面,这样会大大提高缓存的效率。

memcache模块的主页 http://drupal.org/project/memcache

此外,如果一台主机上有多个memcache实例,参考了网上的一片文章,http://www.sunchis.com/html/db/memcached/2011/0909/361.html
自定义启动和停止的脚本,不必再kill和逐个启动memcache。

50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/bin/sh 
# 
# Startup script for the server of memcached 
# 
# processname: memcached 
# pidfile: /etc/memcached/memcached.pid 
# logfile: /etc/memcached/memcached_log.txt 
# memcached_home: /etc/memcached 
# chkconfig: 35 21 79 
# description: Start and stop memcached Service 
 
MEMCACHED_HOME=/etc/memcached 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MEMCACHED_HOME/lib 
 
# Source function library 
. /etc/rc.d/init.d/functions 
 
RETVAL=0 
 
prog="memcached" 
basedir=/etc/memcached 
cmd=${basedir}/bin/memcached 
 
# 绑定侦听的IP地址 
ipaddr=`/sbin/ifconfig eth0|sed -n '2p'|awk '{print $2}'|cut -c 6-30` 
 
# 设置memcached启动参数 
port=11210                     # 服务端口基数,使用11210 + i的方式 
threads=4                      # 在服务器上运行memcached进程的最大进程数 
user=`whoami`                  # 运行程序的用户身份 
max_memory=128                 # default: 64M | 最大使用内存 
max_simul_conn=1024            # default: 1024 | 最大同时连接数 
#maxcon=51200 
#growth_factor=1.3             # default: 1.25 | 块大小增长因子 
#thread_num=6                  # default: 4 
#verbose="-vv"                 # 查看详细启动信息 
#bind_protocol=binary          # ascii, binary, or auto (default) 
start() { 
    echo -n $"Starting $prog: " 
    for((i=1;i

4. 使用CDN
要想使页面加载较快,必须使用CDN。(原理请查阅相关文档)
CDN Drupal有两个模块 Parallel 和 CDN,Parallel比较简单,推荐使用。但是Parallel目前已经并入CDN模块,所以还是得要下载CDN模块 http://drupal.org/project/cdn

5. 数据库结构合理、分表、分库

首先告诫一点:不要使用content-profile模块
该模块把profile信息存储成一种你node-type,问题是这样会导致node表比较大,但是profile的node除了uid之外其他都是无用信息。加入一个网站有上百万、千万用户,再有很多文章(node),这样node表将会非常大,尤其是一个user有很多profile的node,比如5个,这样node表就会有5倍的user数量的node。导致查询node、user都没法处理,views之类的工具更是没法用,因为views生成的SQL将会非常慢。

把user相关表分出去,到独立的数据库,这样可以方便其他站点,比如子站,共享用户信息。

对于大型网站,不推荐使用太多第三方模块,因为大多模块都是基于node,如果跟node没有关系的独立数据,建议自己写模块来读写,这样方便数据的拆分和优化,又减轻了node表的压力。所以再使用模块前,必须了解模块的工作机制。

6. 服务器

Web服务器建议,推荐使用HAProxy/Varnish作为前端代理,Nginx作为Web服务器,php-fpm作为FastCGI处理PHP程序,当然也可以使用Apache作为PHP后端处理,但是不推荐使用apache作为Web节点服务器。

Drupal有一个Varnish相关的模块 http://drupal.org/project/varnish

7. 使用Drupal的Pressflow版本

Drupal本身没有太多考虑性能的优化,Pressflow是一个专门针对Drupal的优化版本,包括支持Mysql Master-Slave等等。对于大型网站,选择Pressflow是必须的。

http://pressflow.org/

8. 其他相关模块

 

模块

版本

缓存类型

效率

匿名 注册

更新状态

1. Boost5.x, 6.x对匿名用户直接调用文件缓存非常高匿名用户6.xyes
5.xno
2. Javascript Aggregator5.x, 6.x文件中等全部Yes
3. Cache Router5.x-beta, 6.x-rc, 7.x-beta数据库、文件、PHP opcode和内存根据设置从中等到非常高根据设置Yes
4. CDN6.x, 7.x服务器全部Yes
5. CacheExclude5.x, 6.x数据库中等匿名用户Yes
6. CSS Gzip6.x文件中等全部Yes
7. Memcache API and Integration5.x, 6.x内存大部分匿名用户Yes
8. Block Cache5.x-dev数据库中等全部Yes
9. Block Cache Alter6.x数据库中等全部Yes
10. Term Lower Name6.x数据库中等全部更新较少
11. Path Cache6.x根据设置中等全部更新较少
12. Advanced Cache5.x, 6.x-dev数据库中等大部分注册用户Yes
13. Authcache6.x-rc数据库、文件、PHP opcode和内存根据设置从中等到非常高全部匿名用户,大多数注册用户Yes
14. Previous/Next API6.x-dev数据库中等全部较少更新
15. fastpath_fscache4.7.x-dev, 5.x-rc, 6.x-dev对匿名用户调用文件缓存(避开db)High匿名用户Yes
16.Varnish6.x-dev, 7.x-devReverse proxy(虚拟内存)非常高全部注册用户,大部分匿名用户测试阶段
17. High-performance JavaScript callback handler6.x, 7.xJavascript Callback中等全部Yes
18. Apache Solr6.x-dev, 7.x-dev全文检索主要对于搜索页面的提高Yes

最后一提的是关于性能分析
PHP中debug和性能分析推荐使用xdebug和xhprof,两个模块都可以详细都列出函数执行都步骤以及时间,相比较而言xhprof比较轻量级一下,可以下载drupal的xhprof模块来配合使用,效果更加~


来自   http://www.360doc.com/content/12/1119/15/7312479_248792088.shtml


普通分类: