2013-03-01 53 views
10

Tôi đang dabbling với quá trình truyền thông quá trình; mục đích là để có các quy trình công nhân thực hiện một số tính toán và trả lại kết quả cho một quá trình kiểm soát. Tôi đã cài đặt zeromq.node và thiết lập trình yêu cầu và trả lời đơn giản trong coffeescript.Hiệu suất mong đợi của ZeroMQ là gì?

người yêu cầu:

# requester.coffee 

zmq      = require 'zmq' 
context     = new zmq.Context() 
socket     = zmq.socket 'req' 

socket.bind 'tcp://127.0.0.1:5555', (error) => 
    throw error if error? 
    console.log 'Requesting writer bound to port 5555' 
    setInterval (-> socket.send 'helo world'), 1 


response_count = 0 
t0    = new Date()/1000 

socket.on 'message', (message) -> 
    response_count += 1 
    # x = message.toString 'utf-8' 
    if response_count % 1000 is 0 
    t1    = new Date()/1000 
    console.log "received #{ parseInt response_count/(t1 - t0) + 0.5 } messages per second" 
    response_count = 0 
    t0 = new Date()/1000 

Các trả lời:

# responder.coffee 

zmq      = require 'zmq' 
context     = new zmq.Context() 
socket     = zmq.socket 'rep' 

socket.connect 'tcp://127.0.0.1:5555' 
console.log 'Responder bound to port 5555' 
process.stdin.resume() 

request_count = 0 
t0    = new Date()/1000 

socket.on 'message', (message) -> 
    request_count += 1 
    # message = message.toString 'utf-8' 
    # console.log message 
    socket.send 'helo back' 
    if request_count % 1000 is 0 
    t1    = new Date()/1000 
    console.log "received #{ parseInt request_count/(t1 - t0) + 0.5 } messages per second" 
    request_count = 0 
    t0 = new Date()/1000 

Bây giờ khi tôi chạy chúng trong cửa sổ terminal riêng biệt trên ubuntu của tôi (11.10, 8GB, Intel Core Duo 3GHz, NodeJS 0.8.6) máy, tôi nhận được kết quả sau:

received 135 messages per second 
received 6369 messages per second 
received 6849 messages per second 
received 6944 messages per second 
received 7042 messages per second 
received 7143 messages per second 
received 5952 messages per second 
received 2967 messages per second 
received 914 messages per second 
received 912 messages per second 
received 928 messages per second 
received 919 messages per second 
received 947 messages per second 
received 906 messages per second 
received 918 messages per second 
received 929 messages per second 
received 916 messages per second 
received 917 messages per second 
received 916 messages per second 
received 928 messages per second 

(1) trông hơi giống một số loại satu khẩu phần ăn trong kênh truyền sau vài giây; (2) cảm thấy không đủ nhanh. theo số this benchmark, tôi phải ở trong hàng trăm nghìn - không phải hàng nghìn tin nhắn mỗi giây, được phân phối bởi this discussion ("ZeroMQ: Mất khoảng 15 giây để nhận 10.000 tin nhắn").

Tôi cũng đã cố sử dụng bộ trả lời được viết bằng python 3 và có cùng số chính xác. những gì nhiều hơn, tôi đã viết một cặp thay thế của kịch bản, nơi mà quá trình tổng thể sẽ đẻ trứng một quá trình con và giao tiếp với nó trên stdout/stdin; Tôi thu được khoảng 750 tin nhắn mỗi giây (tôi không thể thấy nhiều khác biệt khi tôi tăng chiều dài tin nhắn), mà là giống như các ballpark giống như thí nghiệm zeromq.

Những con số này có được mong đợi không? Yếu tố hạn chế ở đây là gì?

+3

REQ-REP đồng bộ là giới hạn chính, xem hướng dẫn về các ví dụ không đồng bộ khác để tăng tỷ lệ hiệu suất. –

+0

không chắc chắn tôi hiểu bạn một cách chính xác, nhưng không có vấn đề bao nhiêu thiết bị đầu cuối trả lời tôi mở, tỷ lệ báo cáo của người yêu cầu luôn ở trong phạm vi 900 mps. bây giờ người yêu cầu chắc chắn không chặn, và nó gửi ra các yêu cầu nhanh như nó có thể - như đối với javascript trên nodejs, chắc chắn nhanh hơn 1 yêu cầu mỗi mili giây? – flow

+1

bạn có 'setInterval ... 1', điều đó không có nghĩa là nó chỉ gửi một tin nhắn mỗi mili giây? Điều đó sẽ cho bạn giới hạn trên 1k msg/giây. Loại bỏ setInterval và đặt socket.send bên trong khối 'on 'message'' cho người yêu cầu nếu bạn thực sự muốn xem giới hạn của nó. – minrk

Trả lời

7

Tôi nghĩ hai điều đang diễn ra. Trước tiên, bạn có setInterval (-> socket.send 'helo world'), 1. Điều này sẽ gửi một yêu cầu mỗi mili giây, do đó bạn sẽ bị giới hạn trong 1000 yêu cầu mỗi giây.

Ngoài ra, mô hình yêu cầu/phản hồi là đồng bộ. Một yêu cầu đến trên một ổ cắm và khối cho đến khi một phản ứng được đưa ra. Với phản hồi, yêu cầu tiếp theo được xử lý và bị chặn.

Tôi đã thay đổi tập lệnh yêu cầu từ socket = zmq.socket 'req' thành socket = zmq.socket 'push'setInterval (-> socket.send 'helo world'), 0 thành socket.send 'helo world' while true. sau đó tôi đã thay đổi kịch bản trả lời khi socket = zmq.socket 'rep'-socket = zmq.socket 'pull' và có sản lượng này

$ coffee responder.coffee 
Responder bound to port 5555 
received 282 messages per second 
received 333357 messages per second 
received 249988 messages per second 
received 333331 messages per second 
received 250003 messages per second 
received 333331 messages per second 
received 333331 messages per second 
received 333331 messages per second 
... 

Người yêu cầu đã không có đầu ra vì nó đã được chặn trên vòng lặp while, nhưng nó chứng minh rằng ØMQ có thể có được hiệu suất tốt hơn nhiều.

Các vấn đề liên quan