Home

zhangyiqun

Thoughts, stories and ideas.

Notes Blog Archives About
12 Feb 2009

玩转apache之调优

1、除特别说明外,本博客内容皆为原创,可以自由转载传播,但请署名及注明出处,不尊重别人劳动成果的不欢迎;

2、本博客内容遵守“署名-非商业性使用-禁止演绎 2.5 中国大陆”协议;

作者:张逸群

Mail:jeantoe@gmail.com

调优是一个大主题,涉及面颇广。目前受条件所限,大部分人可能只能从apache本身入手调优。所以本文将主要从apache的配置方面入手来详解apache调优。希望对正在使用apache的朋友有所裨益,有什么问题欢迎交流探讨,大家共同学习共同进步!

KeepAlive参数

KeepAlive On

MaxKeepAliveRequests 0

KeepAliveTimeout 15

使用keepalive可以在单一连接时进行多个请求。

Keepalivetimeout 每个连接保持的时间

MaxKeepAliveRequests这个我就不解释了,意思是最大保持的连接数,为不限制。

我在来形象的描述一下,KeepAlive中的连接就像是餐厅中的女服务员,我和几个哥们要了几个菜以后,她不走还站继续服务(雅间门口的服务员),等了一个小时超过了她的最大服务时间(Keepalivetimeout),于是她撤了

这个功能是开还是不开呢?因服务器而异,就像五星级的餐厅和街边小餐馆的区别。


选择多处理模块(Multi-Processing ModuleMPM

这玩意主要负责管理网络连接、调度请求。理解成不同的社会制度就好,万恶的封建主义和万恶的资本主义,很难说的清谁好谁坏,所以针对不同情况选择就好。

每次只能有一种 MPM 被应用,必须使用 <span lang="EN-US">–with-mpm=<em>(worker|prefork|event)</em> </span>静态编译。Apache默认安装是使用一个进程的传统模型称为 prefork。较新的线程化模型称为 worker,它使用多个进程,每个进程又有多个线程,这样就能以较低的开销获得更好的性能。最新的 event MPM 是一种实验性的模型,为不同的任务使用单独的线程池。要确定当前使用的是哪种 MPM,可执行 <span lang="EN-US">httpd -l</span>

MPM中的MinSpareServers MaxSpareServers

MinSpareServers指令设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。

只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。

MaxSpareServers指令设置空闲子进程的最大数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成“MinSpareServers+1″

以上说明摘自apache中文手册。根据我个人的理解这个进程就像是apache大酒店的服务小姐,MinSpareServers设置的就是小姐的基本富裕人数,服务员带着我去开房了这时候如果有其他人来也需要有人照顾的对吧?这个富裕人数就是应对这种状况的。MaxSpareServers就是最大空闲人数了,什么意思?你一个三星apache大酒店搞2万个服务员开的下去吗?很显然除非你有门路,不然是没有那么多人的,服务员住哪(硬件)都是个问题。哈哈,扯远了。所以设定这个值一定要结合自身情况,当客流量大的时候数值也适当增大。可是流量大的时候也就是个别时段,所以用crontab搞一下就好

prefork模式中的调节

默认配置如下

StartServers       8

MinSpareServers    5

MaxSpareServers   20

ServerLimit      256

MaxClients       256

MaxRequestsPerChild  4000

几乎所有的文档都会罗列出上面的数据。StartServers的值是只要启动服务就会立即启动 8 个进程,并尽力保持 5 到 20 个空闲服务器运行。进程数的硬性限制由 <span lang="EN-US">MaxClients</span> 指定。尽管一个进程能够处理许多相继的请求,Apache 还是会取消连接数超过 4,000 以后的进程,这降低了内存泄漏的风险。

Worker模式中的调节

默认配置如下

StartServers         2

MaxClients         150

MinSpareThreads     25

MaxSpareThreads     75

ThreadsPerChild     25

MaxRequestsPerChild  0

prefork的调节类似,不同之处只是必须确定使用多少线程和进程。要经过几次尝试和出错之后才能选好要使用的值。最重要的值是 <span lang="EN-US">MaxClients</span>。目标在于允许足够多的 workder 进程或线程运行,同时又不会导致服务器进行过度的交换。如果传入的请求超出处理能力,那么至少满足此值的那些请求会得到服务,其他请求被阻塞。

如果 <span lang="EN-US">MaxClients</span> 过高,那么所有客户机都将体验到糟糕的服务,因为 Web 服务器会试图换出一个进程,以使另一个进程能够运行。而设得过低意味着可能会不必要地拒绝服务。查看高负载下运行的进程数量和所有 Apache 进程所导致的内存占用情况对设置这个值很有帮助。如果 <span lang="EN-US">MaxClients</span> 的值超过256,必须将 <span lang="EN-US">ServerLimit</span> 也设为同样的数值

缓存动态内容

</span> </p>

CacheForceCompletion 100

CacheDefaultExpire 3600

CacheMaxExpire 86400

CacheLastModifiedFactor 0.1

</span> </p>

CacheEnable disk /

CacheRoot /home/wwwroot/

CacheSize 327680

CacheDirLength 4

CacheDirLevels 5

CacheGcInterval 4

</IfModule>

</span> </p>

CacheEnable mem /

MCacheSize 8192

MCacheMaxObjectCount 10000

MCacheMinObjectSize 1

MCacheMaxObjectSize 51200

</IfModule>

</IfModule>

参数的解释

mod_cache.c

CacheEnable: 启动mod_cache其后接两个参数。第一个参数指定快取的种类,应设为mem(记忆体快取)disk(磁碟快取)之其一;第二个参数指定使用快取的URI路径,如果对整个网站(或虚拟主机)进行快取,简单指定为根目录(/)即可。

CacheForceCompletion: 指定当 HTTP request 被取消时,内容的产生动作要完成的百分比;预设是60(%)

CacheDefaultExpire: 指定快取的预设过期秒数;预设值是一小时 (3600)

CacheMaxExpire: 指定快取最大的过期秒数;预设值是一天 (86400)

CacheLastModifiedFactor: 用来从回应里 Last Modified 资讯算出 expire date

mod_disk_cache.c

CacheRoot: 指定磁碟快取所使用的目录。

CacheSize: 指定快取使用的磁碟空间大小;以 KByte 为单位。

CacheDirLength: 指定各目录存在于快取階层(hierarchy) 中所使用的字元数。

CacheDirLevels: 指定快取的目录层数; CacheDirLengthacheDirLevels设定值相乘不能超过 20

CacheGcInterval: 指定收垃圾 (Garbage Collection) 的动作间隔时间;单位是小时。Apache2 中这个指令还沒有被实在。

mod_mem_cache.c

MCacheMaxObjectCount 最大缓存对象数;默认值1009

MCacheMaxObjectSize 缓存允许的最大文档大小;默认值10000

MCacheMaxStreamingBuffer 内存中允许缓冲的最大流式响应字节长度;默认值100000MCacheMaxObjectSize中的小者。

MCacheMinObjectSize 允许缓存的最小文档大小;默认值 0

MCacheRemovalAlgorithm 定义在需要时哪个文档被移出缓存的算法;默认值 LRU|GDSF

MCacheSize 允许使用的最大内存量;以KB为单位默认值100

关闭网页内容协商

一个资源可能会有多种不同的表现形式,比如,可能会有不同语言或者媒体类型的版本甚至其组合。最常用的选择方法是提供一个索引页以供选择。但是由于浏览器可以在请求头信息中提供其首选项的表现形式,因此就有可能让服务器进行自动选择。

除非是五星级饭店各国来宾都比较多,否则不建议开启,因为这玩意严重降低性能。

Options -MultiViews

关闭或者开启符号链接

这个符号连接就是俗称的软链接,好像是windows中的快捷方式。

通过这个链接用户很可能就进入到你不想让他们看见的位置,从安全角度上来说这是非常糟糕的。所以从安全角度上考虑那就用Options SymlinksIfOwnerMatch 。当然也许你根本不知道那个符号链接是个什么东西,那就直接Options FollowSymlinks

控制.htaaccess文件

关闭在全局选项中改为AllowOverride None

这样可以省去apachehtaccess的时间,也自然就节省了资源。

那么原来的.htaccess的如何安置呢?将其放入即可。

关闭DNS查询

五星级餐厅用的都少。直接关闭。

HostNameLookups Off

当优化工作完成后

使用ab对负载进行测试

ab –n 1000 –c 1000 http://www.yourdomain.com/site.html

-n 1000 表示请求1000

-c 1000 表示每次1000个请求

因为只能对某个页面进行测试,注意是单位是个。所以最后的结果可能并不一定能反应真实情况。

或者使用 Apache Ant Apache JMeter 频繁进行负载测

http://blog.sina.com.cn/s/blog_4d1cc4c90100becq.html

结合自身情况确保关闭系统中不需要的服务

参考文献

Apache KeepAlive 配置的合理使用

http://www.linuxtone.org/viewthread.php?tid=913&highlight=apache

Keepalive的开启与关闭

在理想的网络连接状况下,系统的 Apache 进程数和内存使用可以用如下公式表达:
HttpdProcessNumber = KeepAliveTimeout * TotalRequestPerSecond / Average(KeepAliveRequests)
HttpdUsedMemory = HttpdProcessNumber * MemoryPerHttpdProcess
换成中文:
Apache进程数 = KeepAliveTimeout * 每秒种HTTP请求数 / 平均KeepAlive请求
Apache
占用内存 = Apache进程数 * 平均每进程占用内存数

需要特别说明的是:
[平均KeepAlive请求] 数,是指每个用户连接上服务器后,持续发出的 HTTP 请求数。当KeepAliveTimeout 0 或者 KeepAlive 关闭时,KeepAliveTimeout 不参与乘的运算从上面的公式看,如果[每秒用户请求] 多,[KeepAliveTimeout] 的值大,[平均KeepAlive请求] 的值小,都会造成 [Apache进程数] 多和 [内存] 多,但是当 [平均KeepAlive请求] 的值越大时,[Apache进程数] [内存] 都是趋向于减少的。
基于上面的公式,我们就可以推算出当 平均KeepAlive请求 <= KeepAliveTimeout 时,关闭 KeepAlive选项是划算的,否则就可以考虑打开。

理论性的参考大部分来自《Apache 2.2 手册》中文版。

http://lamp.linux.gov.cn/Apache/ApacheMenu/index.html

Notes Blog Archives About