<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[Centos5.5下AMP组件性能调优]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Tue, 05 Oct 2010 13:18:17 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	此文继Centos5.5下编译安装AMP环境而来，编译安装好AMP环境后，默认的配置，并不是最优的性能，很多参数需要根据网站的不同状况进行调节。<br/><br/>1，Apache的性能调节<br/>1.1配置合适多道处理模块(MPMs)<br/>MPMs是Apache2以后提供了一个核心模块，主要的功能是管理网络请求，调度请求，处理进程线程等；对于不同的操作系统而言，有不同的进程模型。最主要的有Prefork和Worker模型。Apache和PHP组合，建议使用Prefork模块。关于MPMs，这里不做多的描述，可以参考Apache多路处理模块MPMs之prefork模型，这里有详细的说明。<br/><br/>1.2，持久连接<br/>客户端向服务器建立TCP连接的时候，可以在一次TCP连接中发送多个请求。这个值默认是5，意味着这个连接关闭之前还可以处理这个连接上的5个请求。如果设为0，则禁用持久连接。此值应用不同的场景。如果一个页面有很多图片请求，如果开启了此功能，则一次TCP连接，可以请求多个图片。建议开启，并将KeepAliveTimeout设置为较小的值，建议值10。<br/><br/>1.3，内容压缩<br/>客户端向服务器发送请求，服务器将数据发送给客户端的过程中，除了网络因素的影响外，发送的数据大小对传输速度也有影响。所以，少输出，意味着更快的速度。使用Gzip内容压缩，可以有效的减少数据传输量。在Apache2以后，mod_deflate模块专做此事。不过默认是没有安装的需要手动编译下。<br/>进入到apache的源码目录，如：cd /usr/local/src/lamp/http-2.2.15/modules/filters/<br/>apxs安装mod_deflate模块 : /usr/local/apache2/bin/apxs -i -a -c mod_deflate.c<br/>打开 vi /usr/local/apache2/conf/httpd.conf 文件，找到如下代码：<br/>LoadModule deflate_module modules/mod_deflate.so<br/>添加如下配置代码在httpd.conf中：<br/>DeflateCompressionLevel 9<br/>AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php<br/>AddOutputFilter DEFLATE css js<br/>重启apache /etc/init.d/httpd restart<br/>这个模块的配置参数很多，也比较复杂，最好参考官方文档手册去做。使用压缩，会占有一定的CPU使用。安装后可以去http://gzip.zzbaike.com/检查下压缩状况。<br/><br/>1.4 使用内容协商<br/>HTTP协议中，资源(resource)是一个URL定义的概念实体，有时候，一个资源它在不同的时刻有不同的表现形式，这就叫着可协商的资源。如何让服务器知道并处理这种可协商的资源呢? 一种途径是使用类型表明确指定不同的文件名。在httpd.conf配置如下代码：<br/>DirectoryIndex index.php index.htm index.html<br/><br/>1.5,放弃符号链接<br/>如果在网站空间中使用了Options SymLinksIfOwnerMatch，意味着要进行额外的系统调用，且执行结果并不能缓存。所以建议关闭符号验证，使用Options FollowSymLinks；<br/><br/>1.6 使用轻量级的Web服务器处理静态内容<br/>对于网站的静态内容，如图片。考虑使用lightted,nginx等这样的轻量级服务器，它们的稳定性不如Apache，但能提高处理速度。<br/><br/>1.7，性能测试工具<br/>ab：apache自带的一个轻量级的压力测试工具；<br/>http_load: http://www.acme.com/software/http_load/<br/>webbeach:http://cs.uccs.edu/~cs526/webbench/webbench.htm<br/><br/>2 PHP的性能调节<br/><br/>2.1，升级PHP版本，使用较新的稳定版本。<br/>较新的稳定版本意味着更少的BUG，更优的性能。不过，PHP5.3稳定版改动比较大，对于很多的程序并不适应。建议使用php5.2系列。当然，依情况而定。<br/><br/>2.2，内容压缩<br/>如果Apache没有开启设置mod_deflate.也可以使用PHP来实现。一种方法是在脚本加入ob_start(“ob_gzhandler”)；另一种是在PHP配置文件中开启：zlib.output_compression=1<br/><br/>2.3，修改配置参数<br/>修改php.ini中配置参数，对性能的调节有很大的影响。如关闭全局变量，关闭魔术引用，禁用一些系统调用的函数。<br/><br/>2.4,使用操作码缓存<br/>先看一张图<br/>左边是没有使用操作码缓存的PHP内部运行机制，PHP脚本通过Zend编译之后，在Zend执行过程中，调用相关的函数或方法，如果遇到include/require的文件包含的脚本，脚本返回进行Zend编译在执行。使用操作码缓存后，可以看出，PHP脚本在Zend编译后缓存成操作码，Zend执行操作码，这样PHP脚本只需要编译一次，大大的提高了执行效率。在使用APD测试过程中，没有使用操作码缓存的时候，require_once/include_once是占有时间最多的两个函数。使用之后，他们的占有的时间减少了50%以上。<br/>常用的操作码换成有Zend_Plateform,Xcache,eAccelerator，APC等。我比较喜欢用的是APC。不过，这些程序都不在PHP核心扩展库中，需要从PEAL下载后编译。下以APC为例：<br/><br/>cd /usr/local/src/php-5.1.13/ext<br/>wget http://pecl.php.net/get/APC-3.0.9.tgz<br/>tar +x APC-3.0.9.tgz<br/>cd APC-3.0.9<br/>/usr/local/php/bin/phpize<br/>./configure --with-php-config=/usr/local/php/bin/php-config<br/>make<br/>make install<br/>在php.ini中，写入如下配置：<br/>extension=apc.so<br/>apc.enabled=1<br/>apc.shm_segments=1<br/>apc.shm_size=128<br/>apc.ttl=7200<br/>apc.user_ttl=7200<br/>apc.num_files_hint=1024<br/>apc.mmap_file_mask=/tmp/apc.XXXXXX<br/>apc.enable_cli=1<br/><br/>将APC-3.0.9中的apc.php放在Apache可以访问的目录下。并打开设置好用户名和密码。访问apc.php可以看到相关缓存信息。<br/><br/>2.5 程序代码优化，这很重要。涉及也很广。暂不提。<br/><br/>2.6 调试工具XDEBUG和APD<br/><br/>3 Mysql的性能调节<br/>调节mysql配置文件，可以设置一些服务器参数。以达到资源的合理分配。所以，对/etc/my.cnf设置合理的值，并且在实际的工作环境进行具体的细节调节，对获取较为理想的性能尤为重要。当然，/etc/my.cnf最好能进行版本控制，以便及时的回滚到以前的版本。既然最终的目的是获取的高性能。高性能意味中读取和写入数据的能力强。读取数据快最好的办法是把数据放入内存中，而写入数据的能力直接关系着磁盘I/O的操作，所以，通过/etc/my.cnf来优化Mysql实则是如何调节分配好内存和对I/O的调优。<br/>对mysql而言，把数据缓存到内存里，所以为缓存分配内存是必须的，而MyISAM的键缓存，InnoDB缓存池，查询缓存以及操作系统缓存MyISAM数据是几类重要的缓存。<br/>3.1 MyISAM的键缓存<br/>此缓存由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可以控制键缓存块的大小，避免写入等待。<br/><br/>3.2 Innodb缓存池<br/>使用innodb是严重依赖缓存的，它缓存了索引，数据以及内部结构等。所以，手册上建议在在专用的mysql服务器上将80%的物理内存分配给它。但并非越大越好。innodb_buffer_pool_size选项调节缓存池的大小。<br/><br/>3.3查询缓存<br/>开启查询缓存可以对相同的SELECT语句的结果集缓存起来，访问的时候可以跳过mysql解析优化的过程。query_size_cache选项控制着分配给查询的总内存，query_cache_type表示缓存是否激活，值为ON,OFF,DEMAND,query_size_limit控制大于此值后不缓存，<br/><br/>3.4MyISAM I/O调节<br/>数据立刻而且连续的写入到磁盘，需要昂贵的I/O操作，所以，先将数据缓存起来，等到一定量的时候再一起写入是提高性能的主要方式。当然，这要考虑数据的安全性。MyISAM在写入之后就立即刷新索引写入磁盘，使用delay_key_write变量来执行延迟索引操作。<br/><br/>3.5 Innodb I/O调节<br/>Innodb支持事务，所以事务日志文件的控制在innodb中很重要。innodb_log_file_size和innodb_files_in_group控制日志文件大小的变量对性能的影响很大。默认是5M，上限是4GB,在实际的负载中找到一个合适的大小是很关键的。<br/><br/>另外，mysql数据库中不同的表有不同的存储引擎，但是，这样如何在几种引擎中调节性能会很难，我一般是MyISAM,Innodb其中之一。<br/><br/>3.6 记录慢日志查询。<br/>在vim /etc/my.conf中加入如下配置：<br/>log-slow-queries=/usr/local/mysql/log/slow.log<br/>#开启慢查询日志记录。默认是10s<br/>long_query_time = 5<br/>#为超过5秒的查询做记录<br/>log-queries-not-using-indexes<br/>#记录没有使用索引的查询（Mysql大于4.1）；<br/>使用mysqldumpslow查看相关的慢查询日志。根据经验，主要的慢查询在于几张数据表的JOIN查询，LIKE查询，或者WHERE<br/>查询的字段没有索引。很多的网站要做站内搜索，瓶颈都在于LIKE查询慢。建议不要使用LIKE查询，搜索可以使用Lucene先做文件索引，查找出相应的ID，然后结合数据库根据ID搜索结果。Zend_Search包提供Lucene的PHP实现。还有一种方法是使用全文索引，不过，Mysql自带的全文索引对中文不支持，有一种方法是使用Sphinx+中文分词来实现（暂不提）。<br/><br/>3.7 做强制限制<br/>set-variable=max_connections=500<br/>#连接的最大个数，和Apache中MaxClients相仿，限制只允许的连接数目。查询目前建立过的最大连接数 SHOW STATUS LIKE &#039;max_used_connections&#039;。<br/>set-variable=wait_timeout=10<br/>#终止所有空闲时间超过10s的连接。<br/>max_connect_errors = 100<br/>#当连接出现问题，会继续重试后放弃，锁定主机。设置为100失败后锁定<br/><br/>3.8,优化SQL语<br/><br/>3.9,缓存，将数据缓存的到内存中，如使用Memcached.<br/><br/>3.10,测试脚本<br/>wget http://www.day32.com/MySQL/tuning-primer.sh<br/>chmod +x tuning-primer.sh<br/>./tuning-primer.sh<br/>mysql的配置参数，需要根据实际的状况来调节。使用此脚本，根据提出的建议来调节参数，一般能获得一个较好的性能。<br/><br/>欢迎补充，请留言。<br/>来源：http://www.cardii.net/centos-amp-performance/
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] Centos5.5下AMP组件性能调优]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>