本文提出了配置Apache 1.3或者Apache 2.0服务器的5个技巧。我们将阐述以下的配置方案:调整Apache的accept()串行化、Apache 2.0线程、采用mod_ssl的SSL会话缓存、优化keep-alive超时值以及检查服务器负载以平衡服务器可处理的请求量等。
Apache 1.3.21和Apache 2.0中引入了AcceptMutex 指示符,该指示符给调节服务器的性能带来了一个难得的机会。该指示符配置Apache的accept()处理方式。在某些只有一个侦听器的系统上是不需要接受阻塞的。这就叫Single Listen Unserialized Accept (SLUA)。可是,对那些具有多个侦听器的配置或者在接受系统调用函数上(不管有多少个侦听器)存在thundering herd问题的操作系统上,连接接受程序就必须进行串行化了。
Covalent的Sander Temme对accept()阻塞策略进行了一定程度的性能分析。这份报告总结了Apache 1.3.21在这一方面的有关调整策略,如下所示:
尽管采用AcceptMutex none也是可能的,但是你的系统在这种配置下有可能受到thundering herd问题和死锁的困扰。这些问题会导致服务器减慢处理速度乃至停止响应。none选项绝对不能用在实际系统上。在非正式的测试下,pthread锁应该是最好的解决方案。然而,pthread跨进程阻塞并不是所有系统都可用的。
Apache 2.0有一个显著的改进特性就是支持线程。某些操作系统,比如Solaris,在采取线程技术的条件下可以显著地改进系统性能。而其他操作系统,比如Linux,其性能改进就可能并不是很显著。
在采用Apache 2.0的情况下,处理请求的策略已经理论化了,这就是所谓的MPM:多进程模式(Multi Process Model)。而老一些的Apache 1.3模式则以prefork MPM为代表,在Unix平台上就是默认MPM for 2.0 。在这种模式下有一个独立的进程处理每一请求。可是,假如你编译Apache 2.0的时候带 --with-mpm=worker 选项,那么服务器请求就会由线程来处理。这种方法在精心设计线程实现方案的情况下会大大降低操作系统处理请求的负载。
如果你对Apache 1.3或者在Apache 2.0采用了mod_ssl补充插件(在在Apache 2.0中则已经包含在内),那么你可以采用会话缓存提升系统性能。这种改进会显著降低SSL连接负载。设置会话缓存有三种途径:
在采用以上选项的时候需要指定文件路径。在使用DBM变量的情况下,文件将被写入磁盘。而对共享内存变量来说,文件将被用做操作系统优选共享内存机制的存储备份。值得注意的是,大多数操作系统不允许共享内存段建立在通过网络装载(mount)的驱动器上,比如NFS等,所以必须给服务器提供文件路径。
我们建议你采用共享内存,不过,在那些没有共享内存的平台上则不妨采用DBM方案。
ユーザーが Web サイト上のページを読んでいて、サイト上の別のページにつながるリンクをクリックしたとします。このプロセスが KeepAliveTimeout 期間 (デフォルトは 15 秒) 内に発生する場合、新しい TCP サーバー接続を作成する必要はありません。そうすることで、コンピュータの負荷が大幅に軽減されます。ただし、サーバーはこの時間枠内ではそれ以上のリクエストを処理できません。 KeepAliveTimeout 期間が経過すると、サーバーはさまざまなクライアントからの最新のリクエストを処理できるようになります。したがって、アイドル状態の要求に対応するには、要求元のプロセスまたはスレッドの数を増やす必要があります。最適な結果を得るには、この値を慎重に調整する必要があります。
mod_status を使用してサーバーの負荷を確認し、サーバーのパフォーマンスを調整するための重要な情報を取得します。
apachectl status コマンドは、サーバーのステータスを簡単に確認する方法です。このコマンドの出力には、使用可能なワーカー プロセスが一貫して表示されないとします。次に、MinSpareServers または MinSpareThreads の値を増やすことが最善です (スレッド MPM を使用する Apache 2.0 の場合)。 MaxClients 値を増やす必要がある場合もあります。
この記事で提案されている手法を使用すると、Web サイトの通常の動作を維持しながらサーバーのパフォーマンスを最大化することができます。