abコマンドでapache2の負荷テストを安全に行うために。

■abコマンドでapache2の負荷テストを安全に行うために。
 debian squeezeのデフォルトインストールのapache2で確認する。

 対象のWebサーバは何でも良いのだけど、どういう限界があるかを確認するのが目的とする。

 メモリの空き容量を確認することや、どのパラメータをどう見るべきかなど、
 ありきたりのテスト前の事前準備はググれば出揃っていると思う。

■「同時接続数」 < 「リクエスト総数」

  当たり前だけど、「-c」オプション以上を「-n」オプションで指定する必要がある。
 「-n」は好きな値でよいと思うが、「-c」にはkernelやapache2の設定で制限がある。
 今回は「-c」をどの位に設定するべきか考える。

■サーバの限界を超えたときのゾンビプロセスの確認方法。Ctrl+Cで停止。

 後述の「Failed requests」が0で無くなったら限界。

 限界を超えると、apaceプロセスがゾンビとして認識される。
 ただし、最大でタイムアウト(デフォルトでは15)値の分、反映には遅れが出る。
 ここに出るならサーバが応答しなくなる前に中止した方が良い。
 ただし、カスタマイズした同時接続数の上限値が大き過ぎると、既に応答しないかも知れない。。。

$ while true ;do top -b -n 1 | grep Z | tee -a Z.log;done

■オープンファイルの最大値。
 ※ここまで大きく取れるだけの性能は普通のサーバには無いはず。

$ cat /proc/sys/fs/file-max
198463

■基本的にsoketもFD(ファイルディスクリプタ)なので、ファイルと同等だと考えてよい。
    負荷をかけると「Requests per second」が過去のオープン最大数が更新されるはず。

 ※同時接続数と同じ数のソケットをオープンする。
  「Requests per second」が1よりも小さく無い限り、「現在のオープン数」への反映は見られないはず。

$  cat /proc/sys/fs/file-nr | \
   awk '{print "過去オープン最大数:\t\t"$1"\n現在のオープン数:\t\t"$2"\nオープン可能なファイル数:\t"$3}'
過去オープン最大数:             1408
現在のオープン数:               0
オープン可能なファイル数:       198463

■apache2の現在の制限値(デフォルト)
 ※はじめの一つのpidを得れば充分なのですが。。。
  チューニングの最大値は上記の値を参考に、apache2だけで食いつぶさない程度に。

$ ps -ef | grep apache | grep -v grep | \
  awk '{print $2}' | for list in `xargs`;do \
    sudo grep . /proc/${list}/limits; \
  done | sort -u
Limit                     Soft Limit           Hard Limit           Units
Max address space         unlimited            unlimited            bytes
Max core file size        0                    unlimited            bytes
Max cpu time              unlimited            unlimited            seconds
Max data size             unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max file size             unlimited            unlimited            bytes
Max locked memory         65536                65536                bytes
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max open files            1024                 1024                 files
Max pending signals       16382                16382                signals
Max processes             unlimited            unlimited            processes
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us
Max resident set          unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes

■同時接続数「ESTABLISHED」の監視。Ctrl+Cで停止。
 ※テストする場合は必ず0からはじめる。

$ while true;do netstat -an | grep "\:80 " | grep ESTA | wc -l;sleep 1;done
0
0
0
0
0
553
528
372
176
331
438
0

■KeepAliveのタイムアウト待ち数「TIME_WAIT」の監視。Ctrl+Cで停止。
 ※テストする場合は必ず0からはじめる。
  タイムアウト値分のタイムラグを確認する。長すぎればゾンビの可能性あり。

$ while true;do netstat -an | grep "\:80 " | grep TIME_WAIT | wc -l;sleep 1;done
0
0
0
1872
8256
9733
9886
9368
10172
10172
...

■IP指定でのテスト
 ※まずは名前解決をせず、他に影響の出ない方法で確認する。

$ sudo ab -c 1000 -n 10000 http://192.168.0.1/
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 192.168.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        Apache
Server Hostname:        192.168.0.1
Server Port:            80

Document Path:          /
Document Length:        177 bytes

Concurrency Level:      1000
Time taken for tests:   7.342 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      4380000 bytes
HTML transferred:       1770000 bytes
Requests per second:    1362.06 [#/sec] (mean)
Time per request:       734.184 [ms] (mean)
Time per request:       0.734 [ms] (mean, across all concurrent requests)
Transfer rate:          582.60 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   48 369.9      1    3008
Processing:    17  110 441.8     48    7315
Waiting:       16  108 441.8     47    7315
Total:         37  158 649.4     49    7335

Percentage of the requests served within a certain time (ms)
  50%     49
  66%     50
  75%     50
  80%     50
  90%     52
  95%     59
  98%   3581
  99%   4333
 100%   7335 (longest request)

■hostsだと「Requests per second」がおよそ100程下がる。
 DNSやDNSSECで名前を引くともっと下がるが、様々な条件に依存するので、実際に比べてみて欲しい。

$ sudo ab -c 1000 -n 10000 http://`hostname -f`/ | sed s/"`hostname -f`"/"dummy.domain.example.jp"/g
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 dummy.domain.example.jp (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        Apache
Server Hostname:        dummy.domain.example.jp
Server Port:            80

Document Path:          /
Document Length:        177 bytes

Concurrency Level:      1000
Time taken for tests:   8.103 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      4380000 bytes
HTML transferred:       1770000 bytes
Requests per second:    1234.11 [#/sec] (mean)
Time per request:       810.298 [ms] (mean)
Time per request:       0.810 [ms] (mean, across all concurrent requests)
Transfer rate:          527.87 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        3   60 361.0     16    3031
Processing:    27  106 566.1     60    8049
Waiting:        4   92 567.1     54    8047
Total:         48  166 691.5     74    8096

Percentage of the requests served within a certain time (ms)
  50%     74
  66%     75
  75%     76
  80%     77
  90%     82
  95%     95
  98%    692
  99%   3688
 100%   8096 (longest request)