前述したように、Apache 2.0のデフォルト設定はプロセスベースの処理になっているため、スレッドを使用するには設定の変更(第1回参照)が必要です
以下がスレッド特有の設定です。
<IfModule worker.c> StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule>
MinSpareServers/MaxSpareServersでは待機プロセスの起動個数範囲を設定しましたが、MinSpareThreads/MaxSpareThreadsでは待機スレッドの起動個数範囲を設定します。
MinSpareThreads 25 MaxSpareThreads 75
ThreadsPerChildは、1つのプロセスで生成されるスレッド数を設定します。
ThreadsPerChild 25
Windowsではプロセスが1つしかないため、この値を多くする必要があります。Linuxの場合は複数のプロセスを起動し、そのプロセスそれぞれにThreadsPerChild個のスレッドが生成されるため、Windowsほどの重要性はありません。
最大スレッド数は、MaxClients数で決定されます。ServerLimitを設定する場合は、MaxClientsの値をThreadsPerChildの値で割った数値以上にします。つまり、最大スレッド数は、
MaxClients数=ThreadsPerChild数×プロセス数
となります。
編注:当初、最大スレッド数を
ThreadsPerChild数×MaxClients数
としておりましたが、これは誤りであったため、該当個所を修正させていただきました。お詫び申し上げます(2005年11月8日)。
プロセス数の設定に際しては、Apacheのプロセスがサーバのリソースにどれだけ影響を与えるかを見極める必要があります。1プロセス当たりのメモリ使用量は、psコマンドやtopコマンドで調べられます。
psコマンドでは、「VSZ」と「RSS」の値に注目します。VSZはプロセスの仮想メモリサイズ(kbytes単位)、RSSはプロセスが使用している物理(スワップされていない)メモリサイズ(kbytes単位)です。
# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 27595 15.7 2.8 32712 14392 ? Ss 20:20 0:00 /usr/sbin/httpd apache 27599 0.0 2.8 32712 14404 ? S 20:20 0:00 /usr/sbin/httpd apache 27600 0.0 2.8 32712 14404 ? S 20:20 0:00 /usr/sbin/httpd apache 27601 0.0 2.8 32712 14404 ? S 20:20 0:00 /usr/sbin/httpd apache 27602 0.0 2.8 32712 14404 ? S 20:20 0:00 /usr/sbin/httpd apache 27603 0.0 2.8 32712 14404 ? S 20:20 0:00 /usr/sbin/httpd apache 27604 0.0 2.8 32712 14404 ? S 20:20 0:00 /usr/sbin/httpd apache 27605 0.0 2.8 32712 14404 ? S 20:20 0:00 /usr/sbin/httpd apache 27606 0.0 2.8 32712 14404 ? S 20:20 0:00 /usr/sbin/httpd
topコマンドの場合は、「VIRT」と「RES」の値に注目します。VIRTはプロセスの仮想メモリサイズ(kbytes単位)、RESはプロセスが使用している物理(スワップされていない)メモリサイズ(kbytes単位)です。topコマンドの場合、仮想メモリがサーバ全体でどの程度使用されているかも見ることができます。下の例では、1261092kbytesのうち、125552kbytesが使用されています。
# top top - 20:22:04 up 1 day, 8:07, 5 users, load average: 0.36, 1.49, 8.63 Tasks: 115 total, 4 running, 111 sleeping, 0 stopped, 0 zombie Cpu(s): 42.1% us, 45.4% sy, 0.0% ni, 11.9% id,0.7% wa,0.0% hi, 0.0% si Mem: 507596k total, 176716k used, 330880k free, 5292k buffers Swap: 1261092k total, 125552k used, 1135540k free, 62844k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 27600 apache 15 0 32848 14m 9600 S 7.3 2.9 0:00.50 httpd 27601 apache 15 0 32848 14m 9600 S 7.0 2.9 0:00.47 httpd 27604 apache 15 0 32848 14m 9600 S 7.0 2.9 0:00.45 httpd 27606 apache 15 0 32848 14m 9600 S 6.6 2.9 0:00.37 httpd 27599 apache 15 0 32848 14m 9600 S 6.3 2.9 0:00.19 httpd 27602 apache 15 0 32848 14m 9600 S 6.3 2.9 0:00.19 httpd 27603 apache 15 0 32848 14m 9600 S 6.3 2.9 0:00.19 httpd 27605 apache 15 0 32848 14m 9600 S 6.3 2.9 0:00.19 httpd 27624 apache 15 0 32848 14m 9600 S 6.3 2.9 0:00.19 httpd
使用しているプロセス数とその状態を知ることで、設定した値に余剰があるのか不足があるのかを見極めることができます。Apacheのmod_statusによるステータス表示を使用すると、簡単に調べることができます。mod_statusの詳細は、「Apacheパフォーマンス・チューニングの実践」の「mod_statusによるステータス表示」を参照してください。
上の画面のように、「W」や「R」で埋め尽くされ、プロセス数の上限に達している場合は、MaxClientsを見直して値を上げる必要があります。
「.」が多いようなら、MaxClientsの値が大き過ぎます。ただし、「.」の最大数はMaxClients数ではなくServerLimit数を表しているため、
MaxClients < ServerLimit
のように設定されている場合は、見た目上「.」が使い切られず残ります。そのため、MaxClientsが上限に達しているのか否かが分かりづらくなっています。
「_」で埋め尽くされるようなら、無駄なプロセスが起動しています。MinSpareServers/MaxSpareServersを下げて、サーバのリソースを抑えるようにします。
「D」の表示が多い場合はDNS問い合わせでボトルネックが発生しているため、DNS問い合わせの停止を検討します。ApacheでDNS問い合わせを行わないようにするには、第1回の「パフォーマンスを引き出すには」を参照してください。
Apacheはもともとパフォーマンスが高く、httpd.confでできることも限られます。次回は、プラットフォームやサーバ構成の見直しについて言及します。
Copyright © ITmedia, Inc. All Rights Reserved.