本教程讲解如何通过优化 Linux® 提高 Apache 的性能。
开始之前
Apache 是一个可高度定制的守护进程。可以根据特定平台、环境和性能阈值对这个软件进行大量定制。但是,大多数管理员只运行普通的开箱即用的安装,很少对默认配置进行修改。
本教程针对具有以下需求的读者:
本教程主要关注如何通过优化 Linux 提高 Apache 的性能。学完本教程之后,您应该会熟悉许多控制 Apache 并调整其行为的建议、提示和技巧,使 Apache 更加适合于它运行的环境。涉及的主题包括:
外部性能考虑因素
Apache 在很大程度上依靠自身的配置来管理它的性能和负载,但是它需要借助于操作系统的帮助。本节主要关注如何检查操作系统,确保它产生最佳性能。
Apache 适用于许多种平台,包括 Windows NT/2000、Linux、所有风格的 UNIX、Sun 的 Solaris 和 BSD 系列操作系统。本教程主要关注如何通过优化 Linux 来提高 Apache 的性能。还将学习一些调整方法和技巧。
首先看看内核。您很可能正在运行 Linux 发行版附带的常规内核。尽管常规内核本质上并不差,但是它们常常在预编译时增加了对许多硬件的支持。这主要是为了方便安装,但是有经验的用户会重新编译内核,去掉所有多余的硬件支持。毕竟,在 Web 服务器中为什么需要支持 ham radio 呢?它完全是在浪费宝贵的资源,这些资源本来可以用在更有用的方面。
接下来,访问服务器上的 /usr/src/linux/net 目录,并在文本编辑器中打开 TUNABLE 文件。这个文件列出了在编译内核时可以指定的所有参数。除非理解网络设备配置的内部原理,否则应该避免调整这些配置。对于 Linux 高手和有开发高性能系统经验的其他人,可以通过修改配置提高性能。
现在,脱离 Linux 的范围,看看适用于所有操作系统的一般规则。对于任何服务器,管理员首先应该做的事情是禁用高级电源管理(advanced power management,APM)模块。无论机器是桌面机还是服务器,APM 都会浪费 CPU 和内存资源,而其收益不一定会超过它造成的麻烦和问题。另外,您肯定不希望公司的 Web 服务器莫名其妙地转入睡眠状态。
禁用了 APM 之后,还要检查是否正在运行其他不需要的服务。通过取消这些服务,可以向有意义的服务提供更多机器处理能力,减少资源争用问题对 Web 服务器的影响。可以关闭的一些重要进程,包括不需要使用的任何 Xwindows、KDE、Gnome 任务和其他程序。
还要通过命令行查看目前运行的所有服务及其进程 ID。在下面的 “优先级” 一节中需要这些信息。
可以使用 Linux 实用程序 nice 和 renice 调整剩余服务的优先级。可以使用这些实用程序提高服务器上 Apache 或其他软件的调度优先级,这样操作系统就会认识到它们比其他进程更重要。
例如,可以把 Apache(httpd)的优先级改为 -15,这已经接近上限(优先级从最高的 -20 到最低的 19)。可以从命令行使用这两个实用程序:
这里的差异是 renice 需要进程 ID(或 pid)。如上所述,可以使用 top 查明 pid。nice 和 renice 是很灵活的程序,更多信息参见手册页。
另外,还可以使用 irqtune 实用程序调整处理器响应来自系统中各种设备的中断请求的方式。
使用 hdparm 对硬盘进行调优。可以用这个实用程序调整大多数 Linux 发行版中标准 IDE 驱动器的输入/输出控制。大多数选项适用于常规的 IDE 驱动器,但是一些选项需要 2.0.10 以上版本附带的现代 EIDE 驱动器。
如果使用默认的 Linux 安装,可以把 Linux 的硬盘访问速度提高 2 倍。hdparm 对 IDE 硬盘最有用,但是一些 hdparm 设置也适用于 SCSI。关于 hdparm 实用程序的更多信息,请参见 参考资料 中的链接。
编译 Apache 的定制版本
由于 Apache 简单而且容易掌握,大多数 Linux 发行版都附带预编译和预安装的 Apache。Apache 大量使用模块,所以管理员可以启用许多不同的功能。每个发行版都附带一些可以马上使用的模块,因此开箱即用的 Apache 安装足以满足一般性 Web 站点的需求。
对于您的需求来说,通用的 Apache 配置可能不是最优的。下面学习哪些 Apache 模块可以提供您需要的功能,并构造一个高性能的 Apache 安装。
要想从头构造 Apache 安装,需要完成四个主要步骤:
如果测试没有问题,就把刚创建的文件放在系统中的适当位置。
计划 Apache 安装的关键是确定满足站点需求所需的模块。Apache 附带大约 40 个标准 模块(这些模块是 Apache 开发组认可的)。这些标准模块提供各种各样的功能,包括内容过滤、环境支持和辅助管理。在 http://www.apache.org/docs/mod/index.html 的 Apache 文档中可以找到所有标准模块的名称及其说明(参见 参考资料)。
Apache Module Registry 是一个很好的额外资源,它提供标准模块之外的其他模块。这里提供的模块可以解析身份验证和参数、通过 Jserv 和 Jakarta 项目解释 Java ,并且支持 Python 和 Tcl/tk 等编程语言。
一个值得关注的模块。Mod_so 模块使 Apache 能够在运行时调用其他模块,这样就不需要把其他模块编译到 httpd 二进制文件中。如果管理员需要在系统上运行多个不同配置的 Apache 实例(可能监听不同的网络接口),常常会使用这个功能。
每个实例可以调用自己的模块(在这个上下文中称为共享对象)。管理员只需关注一个 Apache 安装。无论是编译为共享对象,还是静态地编译到 Apache 二进制文件中,大多数模块的功能是相同的。
要想进一步简化模块的动态调用,可以使用 apxs 脚本获取一个或多个模块、把它们编译为共享对象、可选地放置它们并在 Apache 配置文件中启用它们。
共享对象 mod_so 和 apxs 对所有 Apache 用户都有好处,尤其是对于常常修改配置的用户。对源代码的任何修改都需要重新编译 Apache,而这些工具可以避免这些麻烦。
可以使用 APache AutoConf-style Interface(APACI)加快配置过程;用户界面是一个称为 configure 的脚本。configure 脚本使用来自命令行的开关。用来创建 makefile 的最常用开关是 -enable-module、-disable-module、-enable-shared 和 -with-layout。-enable-module 启用一个在默认情况下没有打开的模块,-disable-module 的作用正好相反。这两个开关都需要以 -enable[disable]-module=xxxxx的形式指定模块(模块名是 mod_xxxxx)。
使用 -with-layout 指定在编译 Apache 之后放置各个部分的位置。通过使用布局,可以在编译之前定义所有位置。布局是在 Apache 源代码根目录中的 config.layout 文件中定义的。有几个预定义的布局,但是我总是创建一个定制的布局,使我的所有系统尽可能保持一致。
下面是我在自己的系统上编译 Apache 时最常用的布局。
prefix: /usr/local/apache exec_prefix: $prefix bindir: $exec_prefix/bin sbindir: $exec_prefix/bin libexecdir: $exec_prefix/libexec mandir: /usr/local/man sysconfdir: /etc datadir: $prefix iconsdir: $datadir/icons htdocsdir: $datadir/html cgidir: $datadir/cgi-bin includedir: /usr/include/apache localstatedir: /var/httpd runtimedir: $localstatedir/rtlogs logfiledir: $localstatedir/logs proxycachedir: $localstatedir/proxy |
现在可以开始编译自己的 Apache 可执行程序的过程。
从 http://www.apache.org/dist/ 获得最新的 Apache 源代码并下载到 /tmp 中。到撰写本文时,最新版本是 1.3.22。然后,用以下命令进行文件解压:
# cd /tmp # gunzip -c apache_1.3.22.tar.gz | tar xf - # cd apache_1.3.22/ |
接下来,输入以下命令开始配置过程。
# cd /usr/local/src/apache_1.3.22 # ./configure -with-layout=JonStandard \ -disable-module=imap \ -disable-module=asis \ -disable-module=userdir \ -disable-module=autoindex \ -verbose |
这些禁用的模块只是为了演示如何正确使用语法。在这个实例中,禁用了 mod_imap 和 mod_asis(因为没有 imagemaps 或 asis 文件)以及 mod_userdir 和 mod_autoindex(因为没有用户目录和包含索引文件的其他目录)。还添加了 -verbose 选项,这让 configure 脚本准确地说明其操作。
这个过程完成之后,显示命令提示。要完成 Apache 编译,请在命令提示上:
现在完成了!
完成的二进制文件如下:
# /usr/local/apache/bin/httpd -l Compiled-in modules: http_core.c mod_env.c mod_log_config.c mod_mime.c mod_negotiation.c mod_status.c mod_include.c mod_dir.c mod_cgi.c mod_actions.c mod_speling.c mod_alias.c mod_access.c mod_setenvif.c |
通过配置设置优化 Apache
到目前为止,已经考虑了操作环境中的性能调优和定制编译的 Apache 守护进程的安装,消除了大多数预编译发行版中多余的部分。现在,要关注 Apache 的运行时选项并通过调整它们进一步改进性能。
需要在 Apache 的 httpd.conf 配置文件中设置以下指令:
HostnameLookups off —— 使用域名服务(DNS)的服务总会影响到性能。动态创建的脚本往往只需要 IP 地址,而不是完全规范化的名称。这个指令覆盖默认设置,禁止通过 DNS 进行主机名查询。
AllowOverride none —— 这个指令指示 Apache 不要在它可以访问的每个目录中寻找 .htaccess 文件。如果没有这个指令,Apache 就会浪费处理器时间在提供页面的每个目录中寻找 .htaccess 文件。
Options FollowSymLinks 和 Options SymLinksIfOwnerMatch —— 这些设置消除多余的系统调用。它们告诉 Apache 是否跟随文件系统中的符号链接以及跟随的条件。尽管文件系统中的符号链接更便于使用,但是会降低 Web 服务的速度。
SendBufferSize —— 如果把这个设置的值增加到最大 Web 页面的大小,就可以降低 Web 服务器的磁盘负担。从内存缓冲区提供页面的速度比物理磁盘快几百倍。
DirectoryIndex index.cgi index.pl index.shtml index.html —— 内容协商(Content negotiation)会降低性能,但是大多数实现都需要它。由于其便利性,内容协商成为一种不可避免的开销。为了降低它对性能的有害影响,这个指令提供选项的完整列表,避免 Apache 浪费时间和资源猜测索引文件。
MinSpareServers、MaxSpareServers 和 StartServers —— 这些设置控制 Apache 启动多少个子进程来处理 Web 请求。
1.3 之前的 Apache 版本使用一种称为 ramp-up period 的机制控制启动多少个子进程来处理负载。ramp-up period 机制每秒启动一个子进程。因为对于高负载来说每秒一个子进程的响应时间太慢了,这在基准测试中会成为问题。但是在实践中,因为 Apache 服务器很少重新启动,所以其功用还有待确定:大多数子进程已经装载了,因此不需要 ramp-up period。
Apache 1.3 改变了这个 “每秒一个” 规则,允许子进程以指数形式快速增加。例如,Apache 将生成一个进程,等一秒,然后生成两个进程,再等一秒,然后生成四个进程,依此类推。这个过程一直持续到每秒生成 32 个子进程,或者达到 MinSpareServers 指定的值。
MaxRequestsPerChild 和 KeepAliveTimeout —— 这两个设置控制所有子进程的销毁。
mod_perl,就应该重新考虑修改它的默认值,因为这个模块造成子进程占用大量内存页面。Apache 倾向于逗留刚刚发送数据的连接,但是这样做没有意义。一个小守护进程 lingerd 有助于纠正这种倾向。lingerd 通过接管这些逗留连接,让 Apache 能够立即为另一个 HTTP 请求服务。要使用 lingerd,必须对 Apache 源代码应用补丁。这不适合于新手,但是您应该知道 lingerd 守护进程可以产生显著的速度提升。
PHP 消耗的资源比较多,需要的处理器时间是静态 HTML 页面的 2 到 10 倍。从性能的角度来看,最好只在站点需要的地方上使用 PHP。
为了消除通过 CGI 调用 PHP 的额外开销,要确保把 PHP 静态地安装在 Apache 中或者作为动态调用的模块。另外,应该尝试用 -enable-inline-optimization -disabl debug 设置编译 PHP4。这会提高 PHP 脚本编译的速度,与缓存产品结合使用可以降低生成动态内容时服务器的响应时间。
另外,可以考虑用 -with-mm 选项编译 PHP 并在 php.ini 中设置 session.save_handler=mm,从而切换到共享内存会话。这些修改可能使性能提高一倍。
要想进一步优化 Apache 安装的 PHP 性能,可以使用某种 PHP 缓存产品。缓存脚本意味着不需要在每次调用时都编译脚本。缓存脚本之后,常常能够获得 50% 的性能提升。另外,也可以缓存 PHP 脚本产生的 HTML 结果,这也可以节省时间。
注意事项
您需要快速优化 Web 服务器和检查表吗?本节提供一些简单的技巧和选项,帮助您快速有效地提高 Apache 安装的性能。
使用 Apache 的当前版本。这种 Web 服务器软件的开发当前还在继续。每两周更新一次,甚至更频繁。这些更新常常包含对基本代码的性能改进,或者用来提高 Apache 的灵活性和模块化的新模块。
避免服务器端包含。服务器端包含会消耗大量资源,会增加每个服务器请求的计算时间和开销。存在跨多个页面保持站点结构和内容一致的更高效的方法,但是这超出了本教程的范围。考虑买一本 Web 设计方面的书,里面会介绍这方面的内容。
必须单独启动 httpd。要避免在 inetd 超守护进程或 tcpd 中启动 Apache 进程。要想在引导系统时启动 Apache,应该在 rc.local 中添加 startup 命令,或者把启动脚本放在 /etc/rc.d/rc3.d/ 中。
从另一台机器提供图形。这样,您的服务器只需处理静态 HTML 和已经创建的动态内容。这个技巧对于包含大量图形的站点尤其有意义,这些站点通过使用图像压缩程序节省带宽和下载时间。
要在 Apache 安装上进行压力测试。对 Apache 的压力测试度量改进措施使性能提高了多少。可以使用 ab 程序(在 Apache 的 bin 或 sbin 目录中)模拟服务器的负载。
不要在 Web 服务器上运行无关的服务。为什么要白白消耗处理器和缓存时间呢?应该尽可能让一台机器用于 Web 服务;即使是老式机器也足以应付中低程度的服务负载。Apache 能够充分利用硬件资源,对于老式机器也不例外。
不要使用网络文件系统(NFS)在网络上保存内容或日志。应该把所有内容放在运行 Apache 的服务器的本地磁盘驱动器上。不仅 NFS 的网络吞吐量比本地磁盘子系统上的 I/O 操作低,而且 NFS 还需要处理器时间。
不要为不需要日志的站点保存日志。这应该是显而易见的,尤其是对于专门提供图形的机器。在 httpd.conf 中,使用 TransferLog 指令把这些不需要的日志发送到 /dev/null 销毁掉。
结束语
恭喜!您已经学完了本教程,并且掌握了以下技能:
您可以调整许多选项来提高 Apache 的性能。本教程提供了一些实用的技巧,但还有许多其他技巧。可以通过 参考资料 中列出的链接进一步学习 Apache 性能调优。
学习
Apache::ASP 小组(模块的编写者)撰写的关于 调优 的文章。它声称,只需按照它的指导去做,就可以把性能从每秒 10 个请求提高到每秒 50 个请求。
Jonathan Hassell 拥有并管理 Enable Hosting,这是一家位于北卡罗莱纳州 Charlotte 的 Web 服务提供商。他还定期为计算机行业出版物撰稿。Jonathan 还从事电视剧本写作。可以通过 jon@jonathanhassell.com 与他联系。 | ||
本日志由 flyinweb 于 2009-08-16 17:26:50 发表,目前已经被浏览 3983 次,评论 0 次;
引用通告:http://www.517sou.net/Article/191/Trackback.ashx
It is quite useful and interesting too.
VIRT 的上限是64G,也就是36位, cat /proc/cpuinfo的结果是:addre
昨天要准备用线程重写webbench,试验了下Fedora Linux 2.6.35.14
不明白您的具体的意思是什么?
已经发送到你QQ邮箱
http://www.2mysite.net/scriptencoder/screnc.asp 站长你好,看
你好,我发现一个问题,就是从mysqld2同步过来的数据,在mysqld1的
晕,我说是怎么回事情,原来我和你一样,忘记设置了活动分区