Apache2.2の負荷試験

投稿者: | 2011年2月27日
Pocket

対象サーバについて

製品名 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まで増えました。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です