上次说到了SuperCache的lock选项可以解决DogPileEffect。那么效果究竟如何,我做了个简单的测试:
我使用了Ruby 1.9.3-p392,Rails 3.2.12,只建了my_controller.rb
,其中模拟了一个10秒慢速请求,为了测试方便,缓存时间只设置为5s:
1 2 3 4 5 6 |
class MyController < ApplicationController super_caches_page :index, :expires_in => 5#, :lock => true def index sleep 10 end end |
服务器端使用了unicorn,启动5个worker,测试端开100个并发,50000次请求。
不使用lock:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Concurrency Level: 100 Time taken for tests: 191.103 seconds Complete requests: 50000 Failed requests: 0 Write errors: 0 Total transferred: 40517615 bytes HTML transferred: 23050000 bytes Requests per second: 261.64 [#/sec] (mean) Time per request: 382.205 [ms] (mean) Time per request: 3.822 [ms] (mean, across all concurrent requests) Transfer rate: 207.05 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 3 7.1 0 70 Processing: 16 379 1594.6 118 10288 Waiting: 16 379 1594.6 117 10288 Total: 46 382 1594.8 119 10318 Percentage of the requests served within a certain time (ms) 50% 119 66% 125 75% 130 80% 133 90% 146 95% 163 98% 10125 99% 10136 100% 10318 (longest request) |
使用lock
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Concurrency Level: 100 Time taken for tests: 131.197 seconds Complete requests: 50000 Failed requests: 0 Write errors: 0 Total transferred: 40509485 bytes HTML transferred: 23050000 bytes Requests per second: 381.11 [#/sec] (mean) Time per request: 262.393 [ms] (mean) Time per request: 2.624 [ms] (mean, across all concurrent requests) Transfer rate: 301.53 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 2 5.0 0 71 Processing: 38 260 990.4 127 10326 Waiting: 38 260 990.4 127 10326 Total: 53 262 990.4 129 10333 Percentage of the requests served within a certain time (ms) 50% 129 66% 136 75% 142 80% 146 90% 164 95% 460 98% 493 99% 5378 100% 10333 (longest request) |
结果很明显,启用了lock之后,SuperCache的长达10s的请求数明显更少,使得平均响应速度有明显的提升。
在实际的生产环境中,一般长达10s的请求很少,只缓存5s的请求也很少,但是通常长时间的请求伴随着都是较高的数据库负载,一旦大量出现,容易拖垮整个服务。通过这种机制,就可以明显地让缓存失效时负载曲线平滑。
暴走漫画的服务器使用了这个机制之后,使得平均响应速度从300ms左右降低至了200ms左右。