我在
Ruby(1.9.3-p0)中并发演奏,并创建了一个非常简单的I / O重的代理任务.首先,我尝试了非阻塞的方法:
require 'rack' require 'rack/fiber_pool' require 'em-http' require 'em-synchrony' require 'em-synchrony/em-http' proxy = lambda {|*| result = EM::Synchrony.sync EventMachine::HttpRequest.new('http://google.com').get [200,{},[result.response]] } use Rack::FiberPool,:size => 1000 run proxy =begin $thin -p 3000 -e production -R rack-synchrony.ru start >> Thin web server (v1.3.1 codename Triple Espresso) $ab -c100 -n100 http://localhost:3000/ Concurrency Level: 100 Time taken for tests: 5.602 seconds HTML transferred: 21900 bytes Requests per second: 17.85 [#/sec] (mean) Time per request: 5602.174 [ms] (mean) =end
嗯,我以为我一定在做错事.对于大多数等待I / O的任务,平均请求时间为5.6秒我尝试过另一个:
require 'sinatra' require 'sinatra/synchrony' require 'em-synchrony/em-http' get '/' do EM::HttpRequest.new("http://google.com").get.response end =begin $ruby sinatra-synchrony.rb -p 3000 -e production == Sinatra/1.3.1 has taken the stage on 3000 for production with backup from Thin >> Thin web server (v1.3.1 codename Triple Espresso) $ab -c100 -n100 http://localhost:3000/ Concurrency Level: 100 Time taken for tests: 5.476 seconds HTML transferred: 21900 bytes Requests per second: 18.26 [#/sec] (mean) Time per request: 5475.756 [ms] (mean) =end
嗯,好一点,但不是我所说的成功.最后,我尝试了一个线程实现:
require 'rack' require 'excon' proxy = lambda {|*| result = Excon.get('http://google.com') [200,[result.body]] } run proxy =begin $thin -p 3000 -e production -R rack-threaded.ru --threaded --no-epoll start >> Thin web server (v1.3.1 codename Triple Espresso) $ab -c100 -n100 http://localhost:3000/ Concurrency Level: 100 Time taken for tests: 2.014 seconds HTML transferred: 21900 bytes Requests per second: 49.65 [#/sec] (mean) Time per request: 2014.005 [ms] (mean) =end
这真的是非常令人惊讶的.我在这里遗漏了什么吗?为什么EM在这里表现如此糟糕?有没有一些调整我需要做的?我尝试了各种组合(独角兽,几个彩虹配置等),但是没有一个甚至接近简单的旧I / O阻塞线程.
想法,评论和 – 显然 – 更好的实施建议是非常受欢迎的.
解决方法
看看你的“每次请求的时间”如何完全等于总计“测试所需的时间”?这是由于您的请求数(-n)等于并发级别(-c)而导致的报告算术工件.平均时间是总时间*并发/ num请求.所以报告的意思是当-n == -c将是最长请求的时间.你应该用-n> -c通过几个因素得到合理的措施.
您似乎使用旧版本的ab作为相对较旧的版本,默认情况下报告更详细的结果.直接反对谷歌我显示类似的总时间==平均时间-n == -c,并得到更合理的数字,当-n> -C.你真的想看看req / sec,意味着所有并发请求,以及最终的服务级别细分,以获得更好的理解.
$ab -c50 -n50 http://google.com/ 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 google.com (be patient).....done Server Software: gws Server Hostname: google.com Server Port: 80 Document Path: / Document Length: 219 bytes Concurrency Level: 50 Time taken for tests: 0.023 seconds <<== note same as below Complete requests: 50 Failed requests: 0 Write errors: 0 Non-2xx responses: 50 Total transferred: 27000 bytes HTML transferred: 10950 bytes Requests per second: 2220.05 [#/sec] (mean) Time per request: 22.522 [ms] (mean) <<== note same as above Time per request: 0.450 [ms] (mean,across all concurrent requests) Transfer rate: 1170.73 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 1 2 0.6 3 3 Processing: 8 9 2.1 9 19 Waiting: 8 9 2.1 9 19 Total: 11 12 2.1 11 22 WARNING: The median and mean for the initial connection time are not within a normal deviation These results are probably not that reliable. Percentage of the requests served within a certain time (ms) 50% 11 66% 12 75% 12 80% 12 90% 12 95% 12 98% 22 99% 22 100% 22 (longest request) <<== note same as total and mean above $ab -c50 -n500 http://google.com/ This is ApacheBench,http://www.apache.org/ Benchmarking google.com (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Finished 500 requests Server Software: gws Server Hostname: google.com Server Port: 80 Document Path: / Document Length: 219 bytes Concurrency Level: 50 Time taken for tests: 0.110 seconds Complete requests: 500 Failed requests: 0 Write errors: 0 Non-2xx responses: 500 Total transferred: 270000 bytes HTML transferred: 109500 bytes Requests per second: 4554.31 [#/sec] (mean) Time per request: 10.979 [ms] (mean) Time per request: 0.220 [ms] (mean,across all concurrent requests) Transfer rate: 2401.69 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 1 1 0.7 1 3 Processing: 8 9 0.7 9 13 Waiting: 8 9 0.7 9 13 Total: 9 10 1.3 10 16 Percentage of the requests served within a certain time (ms) 50% 10 66% 11 75% 11 80% 12 90% 12 95% 13 98% 14 99% 15 100% 16 (longest request)