Centos5.5下AMP组件性能调优

jackxiang 2010-10-5 21:18 | |
此文继Centos5.5下编译安装AMP环境而来,编译安装好AMP环境后,默认的配置,并不是最优的性能,很多参数需要根据网站的不同状况进行调节。

1,Apache的性能调节
1.1配置合适多道处理模块(MPMs)
MPMs是Apache2以后提供了一个核心模块,主要的功能是管理网络请求,调度请求,处理进程线程等;对于不同的操作系统而言,有不同的进程模型。最主要的有Prefork和Worker模型。Apache和PHP组合,建议使用Prefork模块。关于MPMs,这里不做多的描述,可以参考Apache多路处理模块MPMs之prefork模型,这里有详细的说明。

1.2,持久连接
客户端向服务器建立TCP连接的时候,可以在一次TCP连接中发送多个请求。这个值默认是5,意味着这个连接关闭之前还可以处理这个连接上的5个请求。如果设为0,则禁用持久连接。此值应用不同的场景。如果一个页面有很多图片请求,如果开启了此功能,则一次TCP连接,可以请求多个图片。建议开启,并将KeepAliveTimeout设置为较小的值,建议值10。

1.3,内容压缩
客户端向服务器发送请求,服务器将数据发送给客户端的过程中,除了网络因素的影响外,发送的数据大小对传输速度也有影响。所以,少输出,意味着更快的速度。使用Gzip内容压缩,可以有效的减少数据传输量。在Apache2以后,mod_deflate模块专做此事。不过默认是没有安装的需要手动编译下。
进入到apache的源码目录,如:cd /usr/local/src/lamp/http-2.2.15/modules/filters/
apxs安装mod_deflate模块 : /usr/local/apache2/bin/apxs -i -a -c mod_deflate.c
打开 vi /usr/local/apache2/conf/httpd.conf 文件,找到如下代码:
LoadModule deflate_module modules/mod_deflate.so
添加如下配置代码在httpd.conf中:
DeflateCompressionLevel 9
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php
AddOutputFilter DEFLATE css js
重启apache /etc/init.d/httpd restart
这个模块的配置参数很多,也比较复杂,最好参考官方文档手册去做。使用压缩,会占有一定的CPU使用。安装后可以去http://gzip.zzbaike.com/检查下压缩状况。

1.4 使用内容协商
HTTP协议中,资源(resource)是一个URL定义的概念实体,有时候,一个资源它在不同的时刻有不同的表现形式,这就叫着可协商的资源。如何让服务器知道并处理这种可协商的资源呢? 一种途径是使用类型表明确指定不同的文件名。在httpd.conf配置如下代码:
DirectoryIndex index.php index.htm index.html

1.5,放弃符号链接
如果在网站空间中使用了Options SymLinksIfOwnerMatch,意味着要进行额外的系统调用,且执行结果并不能缓存。所以建议关闭符号验证,使用Options FollowSymLinks;

1.6 使用轻量级的Web服务器处理静态内容
对于网站的静态内容,如图片。考虑使用lightted,nginx等这样的轻量级服务器,它们的稳定性不如Apache,但能提高处理速度。

1.7,性能测试工具
ab:apache自带的一个轻量级的压力测试工具;
http_load: http://www.acme.com/software/http_load/
webbeach:http://cs.uccs.edu/~cs526/webbench/webbench.htm

2 PHP的性能调节

2.1,升级PHP版本,使用较新的稳定版本。
较新的稳定版本意味着更少的BUG,更优的性能。不过,PHP5.3稳定版改动比较大,对于很多的程序并不适应。建议使用php5.2系列。当然,依情况而定。

2.2,内容压缩
如果Apache没有开启设置mod_deflate.也可以使用PHP来实现。一种方法是在脚本加入ob_start(“ob_gzhandler”);另一种是在PHP配置文件中开启:zlib.output_compression=1

2.3,修改配置参数
修改php.ini中配置参数,对性能的调节有很大的影响。如关闭全局变量,关闭魔术引用,禁用一些系统调用的函数。

2.4,使用操作码缓存
先看一张图
左边是没有使用操作码缓存的PHP内部运行机制,PHP脚本通过Zend编译之后,在Zend执行过程中,调用相关的函数或方法,如果遇到include/require的文件包含的脚本,脚本返回进行Zend编译在执行。使用操作码缓存后,可以看出,PHP脚本在Zend编译后缓存成操作码,Zend执行操作码,这样PHP脚本只需要编译一次,大大的提高了执行效率。在使用APD测试过程中,没有使用操作码缓存的时候,require_once/include_once是占有时间最多的两个函数。使用之后,他们的占有的时间减少了50%以上。
常用的操作码换成有Zend_Plateform,Xcache,eAccelerator,APC等。我比较喜欢用的是APC。不过,这些程序都不在PHP核心扩展库中,需要从PEAL下载后编译。下以APC为例:

cd /usr/local/src/php-5.1.13/ext
wget http://pecl.php.net/get/APC-3.0.9.tgz
tar +x APC-3.0.9.tgz
cd APC-3.0.9
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install
在php.ini中,写入如下配置:
extension=apc.so
apc.enabled=1
apc.shm_segments=1
apc.shm_size=128
apc.ttl=7200
apc.user_ttl=7200
apc.num_files_hint=1024
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.enable_cli=1

将APC-3.0.9中的apc.php放在Apache可以访问的目录下。并打开设置好用户名和密码。访问apc.php可以看到相关缓存信息。

2.5 程序代码优化,这很重要。涉及也很广。暂不提。

2.6 调试工具XDEBUG和APD

3 Mysql的性能调节
调节mysql配置文件,可以设置一些服务器参数。以达到资源的合理分配。所以,对/etc/my.cnf设置合理的值,并且在实际的工作环境进行具体的细节调节,对获取较为理想的性能尤为重要。当然,/etc/my.cnf最好能进行版本控制,以便及时的回滚到以前的版本。既然最终的目的是获取的高性能。高性能意味中读取和写入数据的能力强。读取数据快最好的办法是把数据放入内存中,而写入数据的能力直接关系着磁盘I/O的操作,所以,通过/etc/my.cnf来优化Mysql实则是如何调节分配好内存和对I/O的调优。
对mysql而言,把数据缓存到内存里,所以为缓存分配内存是必须的,而MyISAM的键缓存,InnoDB缓存池,查询缓存以及操作系统缓存MyISAM数据是几类重要的缓存。
3.1 MyISAM的键缓存
此缓存由key_buffer_size选项控制,此值设置为一般为保留内存的25%-50%;当然,前提是使用的是MyISAM引擎。他只缓存索引,数据则被系统缓存。此值还可以创建多个缓存键值。如key1.key_buffer_size;key2.key_buffer_size;然后可以使用CACHE INDEX table1,table2 IN key1;将table1,table2上面的索引不保存到key1中。检测好缓存命中率比较具有实际的意义。myisam_block_siez可以控制键缓存块的大小,避免写入等待。

3.2 Innodb缓存池
使用innodb是严重依赖缓存的,它缓存了索引,数据以及内部结构等。所以,手册上建议在在专用的mysql服务器上将80%的物理内存分配给它。但并非越大越好。innodb_buffer_pool_size选项调节缓存池的大小。

3.3查询缓存
开启查询缓存可以对相同的SELECT语句的结果集缓存起来,访问的时候可以跳过mysql解析优化的过程。query_size_cache选项控制着分配给查询的总内存,query_cache_type表示缓存是否激活,值为ON,OFF,DEMAND,query_size_limit控制大于此值后不缓存,

3.4MyISAM I/O调节
数据立刻而且连续的写入到磁盘,需要昂贵的I/O操作,所以,先将数据缓存起来,等到一定量的时候再一起写入是提高性能的主要方式。当然,这要考虑数据的安全性。MyISAM在写入之后就立即刷新索引写入磁盘,使用delay_key_write变量来执行延迟索引操作。

3.5 Innodb I/O调节
Innodb支持事务,所以事务日志文件的控制在innodb中很重要。innodb_log_file_size和innodb_files_in_group控制日志文件大小的变量对性能的影响很大。默认是5M,上限是4GB,在实际的负载中找到一个合适的大小是很关键的。

另外,mysql数据库中不同的表有不同的存储引擎,但是,这样如何在几种引擎中调节性能会很难,我一般是MyISAM,Innodb其中之一。

3.6 记录慢日志查询。
在vim /etc/my.conf中加入如下配置:
log-slow-queries=/usr/local/mysql/log/slow.log
#开启慢查询日志记录。默认是10s
long_query_time = 5
#为超过5秒的查询做记录
log-queries-not-using-indexes
#记录没有使用索引的查询(Mysql大于4.1);
使用mysqldumpslow查看相关的慢查询日志。根据经验,主要的慢查询在于几张数据表的JOIN查询,LIKE查询,或者WHERE
查询的字段没有索引。很多的网站要做站内搜索,瓶颈都在于LIKE查询慢。建议不要使用LIKE查询,搜索可以使用Lucene先做文件索引,查找出相应的ID,然后结合数据库根据ID搜索结果。Zend_Search包提供Lucene的PHP实现。还有一种方法是使用全文索引,不过,Mysql自带的全文索引对中文不支持,有一种方法是使用Sphinx+中文分词来实现(暂不提)。

3.7 做强制限制
set-variable=max_connections=500
#连接的最大个数,和Apache中MaxClients相仿,限制只允许的连接数目。查询目前建立过的最大连接数 SHOW STATUS LIKE 'max_used_connections'。
set-variable=wait_timeout=10
#终止所有空闲时间超过10s的连接。
max_connect_errors = 100
#当连接出现问题,会继续重试后放弃,锁定主机。设置为100失败后锁定

3.8,优化SQL语

3.9,缓存,将数据缓存的到内存中,如使用Memcached.

3.10,测试脚本
wget http://www.day32.com/MySQL/tuning-primer.sh
chmod +x tuning-primer.sh
./tuning-primer.sh
mysql的配置参数,需要根据实际的状况来调节。使用此脚本,根据提出的建议来调节参数,一般能获得一个较好的性能。

欢迎补充,请留言。
来源:http://www.cardii.net/centos-amp-performance/

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/3595/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!

评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]