LoaRunner性能测试系统学习教程:Apache调优

上期我们讲到
LoaRunner性能测试Apachetop监控 , 这期我们讲LoaRunner性能测试Apache调优 。
UApache调优Apache最近的版本是2.2版 , Apache2.2是一个多用途的web服务器 , 其设计在灵活性、可移植性和性能中求得平衡 。 虽然没有在设计上刻意追求性能指标 , 但是Apache2.2仍然在许多现实环境中拥有很高的性能 。 相比于Apache 1.3 , 2.2版本作了大量的优化来提升处理能力和可伸缩性 , 而且大多数的改进在默认状态下就可以生效 。 但是 , 在编译时和运行时 , 都有许多可以显著提高性能的选择 。 本章节主要阐述在安装Apache2.2时 , 服务器管理员可以改善性能的各种方法 。 关于Apache调优主要包括三个方面的内容:硬件与操作系统方面、运行时的配置和编译时的配置 。
硬件与操作系统方面影响web服务器性能的最大的因素是内存 , 一个web服务器应该尽量不使用交换机制 , 因为交换产生的滞后使用户总感觉“不够快” , 此时用户就可能去按“停止”和“刷新” , 从而给web服务器带来更大的负载 。 所以应该控制MaxClients的设置 , 以避免服务器产生太多的子进程而发生交换 , 先计算出每个Apache进程平均消耗的内存 , 然后再为其它进程留出足够多的内存 。
其他因素比较普通 , 装一个足够快的CPU , 一个足够快的网卡 , 几个足够快的硬盘 , 这里说的“足够快”是指能满足实际应用的需求 。
操作系统是很值得关注的又一个因素 , 已经被证实的很有用的经验有:

  • 选择能够得到的最新最稳定的版本并打好补丁 。 现在许多操作系统厂商都提供了可以显著改善性能的TCP协议栈和线程库 。
  • 如果操作系统支持sendfile()系统调用 , 则务必安装带有此功能的版本或补丁 。 在支持sendfile的系统中 , Apache2可以更快地发送静态内容而且占用较少的CPU时间 。
运行时的配置运行时的配置主要涉及到的相关模块为:mod_dir、mpm_common、mod_status , 涉及到的相关指令为:AllowOverride、HostnameLookups、DirectoryIndex、EnableMMAP、EnableSendfile、KeepAliveTimeout、MaxSpareServers、MinSpareServers、Options、StartServers 。
1)AllowOverride
AllowOverride两种设置All或None , 如果网站空间允许覆盖(通常是用.htaccess文件) , 则Apache会试图对文件名的每一个组成部分都打开.htaccess , 例如:
DocumentRoot/www/htdocs

AllowOverrideAll

如果请求“/index.html” , 则Apache会试图打开“/.htaccess”、“/www/.htaccess”、“/www/htdocs/.htaccess” 。 为了得到最佳性能 , 应当对文件系统中所有的地方都使用AllowOverrideNone设置 。
2)HostnameLookups和其它DNS
在Apache1.3以前的版本中 , HostnameLookups默认被设为On , 这样会带来延迟 , 因为对每一个请求都需要做一次DNS查询 。 在Apache2.2中 , 它被默认地设置为Off 。 如果需要日志文件提供主机名信息以生成分析报告 , 则可以使用日志后处理程序logresolve , 以完成DNS查询 , 而客户端无须等待 。
一般情况下应该是在其它的机器上 , 而不是在web服务器上执行后处理和其他日志统计操作 , 以免影响服务器的性能 。
如果你使用了任何“Allowfromdomain”或“Denyfromdomain”指令(也就是domain使用的是主机名而不是IP地址) , 则代价是要进行两次DNS查询(一次正向和一次反向 , 以确认没有作假) 。 所以 , 为了得到最高的性能 , 应该避免使用这些指令(不用域名而用IP地址也是可以的) 。
【LoaRunner性能测试系统学习教程:Apache调优】注意:可以把这些指令包含在段中使之局部化 。 在这种情况下 , 只有对这个区域的请求才会发生DNS查询 。 下列禁止除了.html和.cgi以外的所有DNS查询:
HostnameLookupsoff

HostnameLookupson

如果在某些CGI中偶尔需要DNS名称 , 则可以调用gethostbyname来解决 。
3)FollowSymLinks和SymLinksIfOwnerMatch
如果网站空间中没有使用OptionsFollowSymLinks , 或使用了OptionsSymLinksIfOwnerMatch , Apache就必须执行额外的系统调用以验证符号连接 。 文件名的每一个组成部分都需要一个额外的调用 。 例如 , 如果设置了:
DocumentRoot/www/htdocs

OptionsSymLinksIfOwnerMatch

在请求“/index.html”时 , Apache将对“/www”、“/www/htdocs”、“/www/htdocs/index.html”执行lstat()调用 , 而且lstat()的执行结果不被缓存 , 因此对每一个请求都要执行一次 , 如果确实需要验证符号连接的安全性 , 则可以这样:
DocumentRoot/www/htdocs