VMware上のCentOSを「今運営中のさくらのVPS」になるべく近い状態にして、ApacheBenchによるベンチマークテストを色々と行ってみた。ApacheBenchは1ファイルに対してのアクセスしか出来ないので、出てきた数字を丸々鵜呑みにする事は出来ないが、ある程度の傾向とを知り、今後の対策のヒントを得ようと思った次第。

まずは環境

  1. Core i7 920 3.3Ghzの2CPUをVMware(CentOS5.5 64bi)に割り当て。
  2. 色々インストールするモジュールは、なるべくさくらのVPSと近い状態に

今回のベンチ環境について

  1. HTMLファイルでPHPが作動するようにして、phpincludeで複数のファイルを読み込んで表示するWebページを用意。本番環境と同様のHTMLファイル。
  2. iptablesは本番環境と同じく、IPアドレスとhashlimitによる細かい振り分けあり。
  3. サーバーログは一切取らない状態にした
  4. mod_deflateによる圧縮はしない状態にした
  5. SetEnvIf~~~Order allow,denyでのアクセス規制は最低限のシンプルなものを用意
  6. keep AliveはOffにしておいた

ベンチ方法

ab -n 10000 -c 300 http://192.168.xx.xx/xxxx.html
とりあえず、同時接続数200程度ではサクサク過ぎた。同時接続数300位にするとロードアベレージが1を超えるようになったので、その位からスタート。

ベンチ前後でTOPしたり、 ps aux | sort -nk 4 したりしてメモリ使用量やロードアベレージをチェック。

普通にCentOSサーバーを起動、何もしない状態

apache    3459 0.0  1.4 255492  7228?       S    21:05   0:00/usr/sbin/httpd
apache    3460  0.0  1.4 255492  7224?       S    21:05   0:00/usr/sbin/httpd
apache    3461  0.0  1.4 255492  7224?       S    21:05   0:00/usr/sbin/httpd
apache    3462  0.0  1.4 255492  7224?       S    21:05   0:00/usr/sbin/httpd
apache    3463  0.0  1.4 255492  7224?       S    21:05   0:00/usr/sbin/httpd
apache    3464  0.0  1.4 255492  7224?       S    21:05   0:00/usr/sbin/httpd
apache    3465  0.0  1.4 255492  7224?       S    21:05   0:00/usr/sbin/httpd
apache    3466  0.0  1.4 255492  7224?       S    21:05   0:00/usr/sbin/httpd
root      3337 0.0  2.4 254468 12424?       Ss   21:05   0:00 /usr/sbin/httpd

何もせず1回apache再起動だけ

apache    3632  0.0  1.7 253684  8816?       S    21:10   0:00/usr/sbin/httpd
apache    3633  0.0  1.7 253684  8816?       S    21:10   0:00/usr/sbin/httpd
apache    3634  0.0  1.7 253684  8816?       S    21:10   0:00/usr/sbin/httpd
apache    3635  0.0  1.7 253684  8816?       S    21:10   0:00/usr/sbin/httpd
apache    3636  0.0  1.7 253684  8816?       S    21:10   0:00/usr/sbin/httpd
apache    3637  0.0  1.7 253684  8816?       S    21:10   0:00/usr/sbin/httpd
apache    3638  0.0  1.7 253684  8816?       S    21:10   0:00/usr/sbin/httpd
apache    3639  0.0  1.7 253684  8816?       S    21:10   0:00/usr/sbin/httpd
root      3337 0.0  3.0 253684 15612?       Ss   21:05   0:00 /usr/sbin/httpd
メモリ増えたぞ?

もう一回、何もせずapache再起動

apache    3652  0.0  1.8 255228  9292?       S    21:12   0:00/usr/sbin/httpd
apache    3653  0.0  1.8 255228  9292?       S    21:12   0:00/usr/sbin/httpd
apache    3654  0.0  1.8 255228  9292?       S    21:12   0:00/usr/sbin/httpd
apache    3655  0.0  1.8 255228  9292?       S    21:12   0:00/usr/sbin/httpd
apache    3656  0.0  1.8 255228  9292?       S    21:12   0:00/usr/sbin/httpd
apache    3657  0.0  1.8 255228  9292?       S    21:12   0:00/usr/sbin/httpd
apache    3658  0.0  1.8 255228  9292?       S    21:12   0:00/usr/sbin/httpd
apache    3651  0.0  1.9 255228  9872?       S    21:12   0:00/usr/sbin/httpd
root      3337 0.0  3.2 255228 16664?       Ss   21:05   0:00 /usr/sbin/httpd
やっぱメモリ増えた

40Kbのhttpd.confをコメントアウトで2MBに肥大化させてみる

apache    3680  0.0  2.0 256708 10340?       S    21:16   0:00/usr/sbin/httpd
apache    3681  0.0  2.0 256708 10340?       S    21:16   0:00/usr/sbin/httpd
apache    3682  0.0  2.0 256708 10340?       S    21:16   0:00/usr/sbin/httpd
apache    3683  0.0  2.0 256708 10340?       S    21:16   0:00/usr/sbin/httpd
apache    3684  0.0  2.0 256708 10340?       S    21:16   0:00/usr/sbin/httpd
apache    3685  0.0  2.0 256708 10340?       S    21:16   0:00/usr/sbin/httpd
apache    3686  0.0  2.0 256708 10340?       S    21:16   0:00/usr/sbin/httpd
apache    3679  0.0  2.1 256708 10912?       S    21:16   0:00/usr/sbin/httpd
root      3337 0.0  3.4 255684 17696?       Ss   21:05   0:00 /usr/sbin/httpd
メモリの増大量に変化は無いように見える。

この時点でのab -n 10000 -c 300 http://192.168.xx.xx/xxxx.html

Concurrency Level:      300
Time taken for tests:   12.761145 seconds
Complete requests:     10000
Failedrequests:       9276
   (Connect: 0, Length: 9276, Exceptions: 0)
Writeerrors:          0
Total transferred:     420862352 bytes
HTMLtransferred:      418582352 bytes
Requests per second:    783.63 [#/sec] (mean)
Time perrequest:      382.834 [ms] (mean)
Time perrequest:      1.276 [ms] (mean, across all concurrent requests)
Transferrate:         32206.99 [Kbytes/sec] received

Connection Times (ms)
             min  mean[+/-sd] median   max
Connect:       0   12241.6     0    9001
Processing:    54  2781449.2     70  12743
Waiting:      54  277 1449.2    70   12743
Total:        54  291 1480.1    71   12757

Percentage of the requests served within a certain time (ms)
  50%     71
  66%     76
  75%     78
  80%     79
  90%     81
  95%    310
  98%   1278
  99%  12703
 100%  12757 (longest request)

サーバー再起動。httpd.confはコメントアウトで2MBに肥大させたまま

apache    3454  0.0  1.3 252472  7024?       S    21:22   0:00/usr/sbin/httpd
apache    3455  0.0  1.3 252472  7020?       S    21:22   0:00/usr/sbin/httpd
apache    3456  0.0  1.3 252472  7020?       S    21:22   0:00/usr/sbin/httpd
apache    3457  0.0  1.3 252472  7020?       S    21:22   0:00/usr/sbin/httpd
apache    3458  0.0  1.3 252472  7020?       S    21:22   0:00/usr/sbin/httpd
apache    3459  0.0  1.3 252472  7020?       S    21:22   0:00/usr/sbin/httpd
apache    3460  0.0  1.3 252472  7020?       S    21:22   0:00/usr/sbin/httpd
apache    3461  0.0  1.3 252472  7020?       S    21:22   0:00/usr/sbin/httpd
root      3332 0.1  2.3 252472 12224?       Ss   21:22   0:00 /usr/sbin/httpd
httpd.confのコメントアウトは関係ないっぽい。メモリ使用量は変わらず。

Concurrency Level:      300
Time taken for tests:   12.752701 seconds
Complete requests:     10000
Failedrequests:       9242
   (Connect: 0, Length: 9242, Exceptions: 0)
Writeerrors:          0
Total transferred:     421034465 bytes
HTMLtransferred:      418753325 bytes
Requests per second:    784.15 [#/sec] (mean)
Time perrequest:      382.581 [ms] (mean)
Time perrequest:      1.275 [ms] (mean, across all concurrent requests)
Transferrate:         32241.48 [Kbytes/sec] received

Connection Times (ms)
             min  mean[+/-sd] median   max
Connect:       0    9194.2     0    9000
Processing:     1  2491395.0     71  12740
Waiting:       0  248 1394.9    71   12738
Total:        55  258 1412.6    71   12751

Percentage of the requests served within a certain time (ms)
  50%     71
  66%     73
  75%     77
  80%     78
  90%     82
  95%     87
  98%    891
  99%  12699
 100%  12751 (longest request)
ApacheBenchでも有意な差は見受けられない。
httpd.confのコメントアウトの量は、サーバーの最適化に何にも関係ない。ガンガン注釈入れよう。

apacheを20回再起動させてみた

USER       PID%CPU %MEM    VSZ   RSSTTY      STATSTART   TIME COMMAND
apache    3871  0.0  5.3 274360 27472?       S    21:30   0:00/usr/sbin/httpd
apache    3872  0.0  5.3 274360 27468?       S    21:30   0:00/usr/sbin/httpd
apache    3873  0.0  5.3 274360 27468?       S    21:30   0:00/usr/sbin/httpd
apache    3874  0.0  5.3 274360 27468?       S    21:30   0:00/usr/sbin/httpd
apache    3875  0.0  5.3 274360 27468?       S    21:30   0:00/usr/sbin/httpd
apache    3876  0.0  5.3 274360 27468?       S    21:30   0:00/usr/sbin/httpd
apache    3877  0.0  5.3 274360 27468?       S    21:30   0:00/usr/sbin/httpd
apache    3870  0.0  5.6 274624 29060?       S    21:30   0:00/usr/sbin/httpd
root      3332 0.3  6.8 274360 34840?       Ss   21:22   0:01 /usr/sbin/httpd
すげーメモリ使用量増えた。
ところがTOPで空きメモリ量を見ると、サーバーリセット後とapacheを20回再起動した後で殆ど変わりが無いんだな。
apache再起動にあまり神経質にならなくても良いかもしんない。

Concurrency Level:      300
Time taken for tests:   12.763983 seconds
Complete requests:     10000
Failedrequests:       9257
   (Connect: 0, Length: 9257, Exceptions: 0)
Writeerrors:          0
Total transferred:     420890096 bytes
HTMLtransferred:      418609868 bytes
Requests per second:    783.45 [#/sec] (mean)
Time perrequest:      382.919 [ms] (mean)
Time perrequest:      1.276 [ms] (mean, across all concurrent requests)
Transferrate:         32201.94 [Kbytes/sec] received

Connection Times (ms)
             min  mean[+/-sd] median   max
Connect:       0   11179.7     0    3002
Processing:     8  2661387.4     75  12742
Waiting:       8  266 1387.4    75   12742
Total:         8  277 1413.3    75   12758

Percentage of the requests served within a certain time (ms)
  50%     75
  66%     77
  75%     78
  80%     79
  90%     83
  95%    101
  98%   2110
  99%  12695
 100%  12758 (longest request)
ApacheBenchやると、数値はちょっとだけ悪化してた。

かなり(運営サイトでは現状考えられないほど)の混雑時になると、レスポンスには影響が出そうな事が解る。

定期的にapacheを再起動させる事も、サーバー自体を再起動させることも、それなりに意味がありそうだと感じた。
と言っても、apacheの再起動は1~2週間に1回、サーバーの再起動は1~3ヶ月に1回やれば十分な感じだけど。