対象サーバについて
製品名 | OpenBlockS 600 |
OS(kernel ver) | Debian lenny(2.6.29) |
CPU | 600MHz(AMCC PowerPC 405EX) |
メモリ | 1GB(DDR2 SDRAM) |
ストレージ | 8GB(Compact Flash) |
はじめに
Apache2.2の基本設定、バーチャルホスト設定、ログ設定等はApache2.2の設定にまとめています。
Maxclients以外のパラメータ(StartServers、MinSpareServers、MaxSpareServers、MaxRequestsPerChild)についてはApache2.2のパフォーマンスチューニング(その1)にまとめています。
MaxclientsについてはApache2.2のパフォーマンスチューニング(その2)にまとめています。
本記事では、Apache2.2のパフォーマンスチューニング(その2)でメモリ使用量の観点から導き出したMaxClients = 280が本当に正しいのかをabコマンドで確かめたいと思います。
通常時のメモリ使用量について
負荷をかける前に使用可能メモリ量を調べます。メモリについては以下のサイトを参考にしました。
http://www.atmarkit.co.jp/flinux/rensai/tantei01/bangai01c.html
以下にポイントを抜粋します。
Activeはページキャッシュや無名ページのうち、最近利用したり、まだストレージとの同期が取れていない「捨てられない」ページです。Inactiveは、同じくページキャッシュや無名ページのうち、最後にアクセスされてからある程度時間がたち、ストレージとの同期も完了していて、すぐに捨てられるページです。また、MemFreeは何の用途にも使っていない物理メモリ量です。よって、/proc/meminfoの出力でいうところのMemFreeとInactiveを足すことで確実に利用可能なメモリ量を算出することができます。
当サーバで状態を確認してみます。
www:~# cat /proc/meminfo MemTotal: 1036684 kB MemFree: 469848 kB Buffers: 148624 kB Cached: 255964 kB SwapCached: 0 kB Active: 266224 kB Inactive: 244512 kB
MemFreeが469M、Inactiveが244Mなので、利用可能なメモリ量は約700Mとなります。
abコマンドによる負荷試験
Apacheに標準で付属している「ab」(Apache Bench)コマンドを使用し、負荷試験を実施します。
abコマンドの詳細についてはhttp://www.atmarkit.co.jp/flinux/rensai/apache15/apache15b.htmlを参照して頂きたいのですが、以下に簡単に使い方を引用します。
abの構文は、
ab [options] URL
のように、オプションとテストを実行するURLを指定する。
例:
ab -n 100 -c 10 http://172.16.1.2/index.html
オプション | 意味 |
---|---|
-n 数値 | テストで発行するリクエストの回数を数値で指定 |
-c 数値 | テストで同時に発行するリクエストの数を数値で指定 |
同時接続数50、4回実施
最初は、別端末(IAサーバ、ホスト名はlabo-2)から試験端末(Openblocks600)に対して、同時接続50アクセスを4回繰り返すことにします。MaxClientsは50で実施します。
labo-2:~# ab -n 200 -c 50 http://www.infra.jp/ This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking www.infra.jp (be patient) Completed 100 requests Completed 200 requests Finished 200 requests Server Software: Apache Server Hostname: www.infra.jp Server Port: 80 Document Path: / Document Length: 10419 bytes Concurrency Level: 50 Time taken for tests: 65.055 seconds Complete requests: 200 Failed requests: 0 Write errors: 0 Total transferred: 2182400 bytes HTML transferred: 2083800 bytes Requests per second: 3.07 [#/sec] (mean) Time per request: 16263.853 [ms] (mean) Time per request: 325.277 [ms] (mean, across all concurrent requests) Transfer rate: 32.76 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 3 12 17.3 4 68 Processing: 8278 15668 2436.8 15373 25768 Waiting: 8233 14773 2330.4 14494 24617 Total: 8282 15681 2443.6 15377 25832 Percentage of the requests served within a certain time (ms) 50% 15377 66% 16053 75% 16402 80% 17424 90% 18838 95% 19614 98% 22708 99% 24069 100% 25832 (longest request)
先ほどのサイトからポイントを引用します。
# リクエストの成否(Complete requestsとFailed requests)
abで発生させたリクエストがすべて成功していればいいが、一部が失敗するようならWebサーバの処理が追い付いていない。これは、特にプログラムを実行してページを生成する場合に起こりやすく、同時接続数の限界を超えていると考えるべきだろう。# 1秒間に処理されたリクエスト数(Requests per second)
Webサーバのベンチマークで、最も重視されるのがこの項目である。CPUのMIPSやデータベースのTPCと同じく、1秒間にどれだけ処理できたかが重要な数値になる。パラメータやプログラムを修正したりしてその効果を測る際にも、この項目の数値がどれだけ改善するか(数値が大きくなるか)で評価を行う。
NGリクエスト数(Failed requests)は0、1秒間に処理されたリクエスト数(Requests per second)は3.07ということになります。
CMSで動的生成するサイトのため低い数字(3.07)になっていますが、NGまではいたっていないということが分かります。
また、その際の使用可能メモリ量の変化は以下の通りでした。
試験前
www:~# cat /proc/meminfo MemTotal: 1036684 kB MemFree: 465592 kB Inactive: 244444 kB
→使用可能メモリ量(MemFree+Inactive)=約700M
同時接続数50 x 2回終了時点
www:~# cat /proc/meminfo MemTotal: 1036684 kB MemFree: 364488 kB Inactive: 244432 kB
→使用可能メモリ量(MemFree+Inactive)=約600M
プロセス数も確認しました。
www:~# ps auxw | egrep '(STAT|apache)' USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 16228 0.1 0.9 71004 9420 ? SNs 20:47 0:00 /usr/sbin/apache2 -k start www-data 16258 0.7 1.1 72400 12000 ? SN 20:48 0:02 /usr/sbin/apache2 -k start www-data 16278 2.8 1.5 72400 16192 ? RN 20:48 0:08 /usr/sbin/apache2 -k start www-data 16282 0.6 1.1 72400 12004 ? SN 20:48 0:01 /usr/sbin/apache2 -k start www-data 16284 0.6 1.1 72400 12004 ? RN 20:48 0:02 /usr/sbin/apache2 -k start ...
長いので割愛しますが、50行ありました。Maxclientsで設定した50プロセスに制限されていることが分かります。
この結果から計算すると、50プロセスを生成するのに100M使用したため、1プロセスあたりのメモリ使用量は、100M/50プロセス=2Mと計算できます。
先に計算した結果が2.5Mぐらいでしたので、おおよそ同じぐらいです。
※ここでは試験結果を割愛しますが、Maxclients=50に設定した状態で同時アクセス数=100(ab -n 200 -c 100 http://www.infra.jp/)の負荷をかけてみたところ、HTTPサーバ側で以下のログが出ました。
www:~# tail -f /var/log/apache2/error.log [Sun Jan 30 20:49:02 2011] [error] server reached MaxClients setting, consider raising the MaxClients setting
同時接続数100、4回実施
次は、別端末(IAサーバ、ホスト名はlabo-2)から試験端末(Openblocks600)に対して、同時接続100アクセスを4回繰り返すことにします。MaxClientsは100で実施します。
labo-2:~# ab -n 400 -c 100 http://www.infra.jp/ This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking www.infra.jp (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Finished 400 requests Server Software: Apache Server Hostname: www.infra.jp Server Port: 80 Document Path: / Document Length: 10419 bytes Concurrency Level: 100 Time taken for tests: 141.712 seconds Complete requests: 400 Failed requests: 1 (Connect: 0, Receive: 0, Length: 1, Exceptions: 0) Write errors: 0 Total transferred: 4354363 bytes HTML transferred: 4157446 bytes Requests per second: 2.82 [#/sec] (mean) Time per request: 35428.011 [ms] (mean) Time per request: 354.280 [ms] (mean, across all concurrent requests) Transfer rate: 30.01 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 3 23 39.4 4 149 Processing: 3912 34004 11191.6 32131 66988 Waiting: 3597 32451 10869.1 30388 65225 Total: 3922 34027 11213.1 32138 67134 Percentage of the requests served within a certain time (ms) 50% 32138 66% 33523 75% 35582 80% 41486 90% 51243 95% 56645 98% 61179 99% 63067 100% 67134 (longest request)
NGリクエスト数(Failed requestsより)が1なので、処理能力ぎりぎりのようです。
先ほど同様、負荷試験時の使用可能メモリ量の変化も見ました。
試験前
www:~# cat /proc/meminfo MemTotal: 1036684 kB MemFree: 448336 kB Inactive: 244332 kB
→使用可能メモリ量(MemFree+Inactive)=約690M
同時接続数100 x 2回終了時点
www:~# cat /proc/meminfo MemTotal: 1036684 kB MemFree: 220108 kB Inactive: 244352 kB
→使用可能メモリ量(MemFree+Inactive)=約460M
230M消費しています。
プロセス数の確認は割愛します。
上記、同時接続数=50の時と同様に計算すると、1プロセスあたりのメモリ使用量は230M/100プロセス=2.3Mです。先に計算した結果の2.5Mと同じぐらいです。
同時接続数150、4回実施
次は、別端末(IAサーバ、ホスト名はlabo-2)から試験端末(Openblocks600)に対して、同時接続150アクセスを4回繰り返すことにします。MaxClientsは150で実施します。
labo-2:~# ab -n 600 -c 150 http://www.infra.jp/ This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking www.infra.jp (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Completed 600 requests Finished 600 requests Server Software: Apache Server Hostname: www.infra.jp Server Port: 80 Document Path: / Document Length: 10419 bytes Concurrency Level: 150 Time taken for tests: 129.741 seconds Complete requests: 600 Failed requests: 285 (Connect: 0, Receive: 0, Length: 285, Exceptions: 0) Write errors: 0 Total transferred: 3572655 bytes HTML transferred: 3357510 bytes Requests per second: 4.62 [#/sec] (mean) Time per request: 32435.231 [ms] (mean) Time per request: 216.235 [ms] (mean, across all concurrent requests) Transfer rate: 26.89 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 3 43 180.4 5 3001 Processing: 3980 29290 24267.9 25360 93750 Waiting: 3637 28282 23299.8 24608 90933 Total: 3989 29333 24319.3 25364 96750 Percentage of the requests served within a certain time (ms) 50% 25364 66% 41203 75% 46294 80% 50409 90% 66723 95% 77980 98% 85676 99% 89777 100% 96750 (longest request)
NGリクエスト数(Failed requests)が285なので、処理能力オーバーのようです。1秒間に処理されたリクエスト数(Requests per second)は4.62で、溢れた分、処理されたリクエスト数も増加してみます。その際の使用可能メモリ量の変化も見ました。
試験前
www:~# cat /proc/meminfo MemTotal: 1036684 kB MemFree: 453360 kB Inactive: 244144 kB
→使用可能メモリ量(MemFree+Inactive)=約700M
同時接続数150 x 2回終了時点
www:~# cat /proc/meminfo MemTotal: 1036684 kB MemFree: 135164 kB Inactive: 244140 kB
→使用可能メモリ量(MemFree+Inactive)=約380M
ただし、Failed requestsがかなり出ているので、上記の値(380M)は参考になりません。
先に確かめたとおり、メモリだけ考えるのであればMaxclients=同時接続数=280まではいけますが、先にCPUの方がボトルネックとなってしまっているようです。
以上の実験より、Maxclients=100ぐらいが適切な値と思われます。
www:~# vi /etc/apache2/apache2.conf <IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 100 MaxRequestsPerChild 1024 </IfModule>
後日追記(2011/2/27)
プロのための Linuxシステム構築・運用技術 (Software Design plus)を読んでいたら、ディスクキャッシュを強制的に開放するコマンドが載っていたので紹介します。まだディスクに反映されていないデータ等も消えてしまうので商用では危険なコマンドですね。
・解放前 www:~# cat /proc/meminfo MemTotal: 1036684 kB MemFree: 133508 kB Inactive: 379720 kB ・コマンド実行 www:~# echo 3 > /proc/sys/vm/drop_caches ・解放後 www:~# cat /proc/meminfo MemTotal: 1036684 kB MemFree: 890280 kB Inactive: 4236 kB
使用可能なメモリ量が500M→900Mまで増えました。