負荷テストその2(Grails 0.5)

プロファイル結果

昨日のHttpSessionがいっぱいになってしまう点については、大量アクセスが発生するサイトではよくあることだ。大量アクセスが短期に発生するようなページで無駄にHttpSessionを使用するとTomcatの場合、OutOfMemoryErrorが発生し、発生したスレッドによってはそのままハングしてしまうという事象はTomcat 5.0 ではよくおきていた。その後の5.5、6.0では検証していないので分からない。ただ、昨日の負荷テストの結果を見る限り同じ?なのではないかと思われる。
まあ、これに対してはよくあることなので独自のHttpSessionの実装が実は用意してある。フィルタをかましてHttpServletRequestをラップして独自のHttpSessionを返す、というやつだ。これをGrailsプラグインでweb.xmlにちょちょいと追加するようなプラグインを作ってインストールした。
ちなみにセッションの永続化についてはehcacheを利用している。テストで使用した際にはehcacheについてはレプリケーション等の設定は行っていない。
再度、同じように負荷をかけてみた。そのときの結果はこれ(GSPなし)。

$ ab -c 300 -n 30000 http://localhost:8080/pagetest-0.1-c/test01
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 3000 requests
Completed 6000 requests
Completed 9000 requests
Completed 12000 requests
Completed 15000 requests
Completed 18000 requests
Completed 21000 requests
Completed 24000 requests
Completed 27000 requests
Finished 30000 requests


Server Software:        Apache-Coyote/1.1
Server Hostname:        localhost
Server Port:            8080

Document Path:          /pagetest-0.1-c/test01
Document Length:        90 bytes

Concurrency Level:      300
Time taken for tests:   73.788111 seconds
Complete requests:      30000
Failed requests:        0
Write errors:           0
Total transferred:      8098725 bytes
HTML transferred:       2700270 bytes
Requests per second:    406.57 [#/sec] (mean)
Time per request:       737.881 [ms] (mean)
Time per request:       2.460 [ms] (mean, across all concurrent requests)
Transfer rate:          107.17 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0  401 2053.1      1   45024
Processing:     7  314 276.2    253    9336
Waiting:        6  299 264.1    245    9238
Total:         74  716 2091.4    263   45322

Percentage of the requests served within a certain time (ms)
  50%    263
  66%    301
  75%    345
  80%    394
  90%    885
  95%   3264
  98%   4140
  99%   9270
 100%  45322 (longest request)

若干スループットが上がってるかも。誤差の範囲ともいえるが。プロファイラの結果で気が付くのは、

  1. コントローラの生成が遅い
  2. コントローラのgetProperty関連処理が遅い

ような気がする。