2012-02-12 26 views
12

Tôi đang chơi xung quanh với đồng thời trong Ruby (1.9.3-p0) và đã tạo một tác vụ proxy I/O-heavy rất đơn giản. Trước tiên, tôi đã thử cách tiếp cận không chặn:Đồng thời Ruby: không chặn I/O và chủ đề

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 

Hmm, tôi nghĩ mình phải làm điều gì đó sai. Thời gian yêu cầu trung bình là 5.6 cho một nhiệm vụ mà chúng tôi chủ yếu chờ I/O? Tôi đã thử một số khác:

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 

Hmm, tốt hơn một chút, nhưng không phải là điều tôi gọi là thành công. Cuối cùng, tôi đã thử triển khai luồng:

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 

Điều đó thực sự thực sự đáng ngạc nhiên. Am i thiếu cái gì ở đây? Tại sao EM biểu diễn quá tệ ở đây? Có một số điều chỉnh tôi cần phải làm không? Tôi đã thử kết hợp khác nhau (Unicorn, một số cấu hình Rainbows, vv), nhưng không ai trong số họ đến thậm chí gần với đơn giản, cũ I/O-chặn luồng.

Ý tưởng, nhận xét và - rõ ràng - đề xuất triển khai tốt hơn rất được hoan nghênh.

+1

Bạn không nên sử dụng máy chủ ở xa để kiểm tra, độ trễ có thể thay đổi. Bạn nên thử lại thử nghiệm async với ít sợi hơn, với 20 sợi tôi nhận được 300ms/yêu cầu so với 1s/yêu cầu với 1000 sợi bằng cách sử dụng đường ab chính xác của bạn. Máy chủ luồng của bạn đang sử dụng nhóm chủ đề eventmachine mặc định là 20 luồng theo mặc định. – Schmurfy

+0

Không chắc chắn, thiết lập kích thước hồ bơi sợi đến 20 thực sự làm giảm hiệu suất trên hộp của tôi. – BSM

+0

Có thể không phải 20 nhưng 1000 thực sự cao, tôi đã thử nghiệm với máy chủ cục bộ để thời gian phản hồi thực sự thấp. – Schmurfy

Trả lời

2

Xem cách "Thời gian cho mỗi yêu cầu" của bạn chính xác bằng tổng "Thời gian thực hiện cho thử nghiệm"? Đây là một tạo phẩm số học báo cáo do số yêu cầu của bạn (-n) bằng với mức tương đương (-c) của bạn. Thời gian trung bình là tổng thời gian * đồng thời/số yêu cầu. Vì vậy, báo cáo có nghĩa là khi -n ==-c sẽ là thời gian của yêu cầu dài nhất. Bạn nên tiến hành ab của bạn chạy với -n> -c bởi một số yếu tố để có được các biện pháp hợp lý.

Dường như bạn đang sử dụng phiên bản cũ của ab là phiên bản tương đối hiện tại, báo cáo kết quả chi tiết hơn nhiều theo mặc định. Chạy trực tiếp với google tôi hiển thị tổng thời gian == thời gian trung bình tương tự khi -n == -c và nhận được các số hợp lý hơn khi -n> -c. Bạn thực sự muốn xem xét req/sec, có nghĩa là trên tất cả các yêu cầu đồng thời và bảng phân tích cấp dịch vụ cuối cùng để hiểu rõ hơn.

$ 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, 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) 
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) 
Các vấn đề liên quan