Apache2.2の負荷試験
対象サーバについて
| 製品名 | 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 /
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:~# 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 /
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 /
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まで増えました。