2013-03-01 4 views
10

मैं प्रक्रिया-से-प्रक्रिया संचार के साथ डबलिंग कर रहा हूं; इसका उद्देश्य कार्यकर्ता प्रक्रियाओं को करना है जो कुछ कंप्यूटेशंस करते हैं और परिणाम को एक नियंत्रण प्रक्रिया में वापस भेज देते हैं। मैंने zeromq.node स्थापित किया और कॉफ़ीस्क्रिप्ट में एक साधारण अनुरोधकर्ता और उत्तरदाता स्थापित किया।ज़ीरोएमक्यू की अपेक्षित प्रदर्शन क्या है?

निवेदक:

# 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 

अवकाश जवाब:

# 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 

अब जब मैं अपने ubuntu (11.10 पर अलग टर्मिनल विंडो में उन्हें चलाने के लिए, 8 जीबी, इंटेल डुओ कोर 3GHz, NodeJS 0.8.6

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) एक छोटे से लग रहा है वहाँ सातू किसी तरह का है जैसे:) मशीन, मैं निम्नलिखित आउटपुट प्राप्त कुछ सेकंड के बाद ट्रांसमिशन चैनल में राशन; (2) पर्याप्त तेज़ नहीं लगता है। this benchmark के अनुसार, मुझे सैकड़ों हजारों में होना चाहिए - प्रति सेकंड हजारों संदेश नहीं, जो this discussion ("ज़ीरोएमक्यू: 10,000 संदेश प्राप्त करने में लगभग 15 मिलियन सेकंड लगते हैं") द्वारा संक्रमित किया जाता है।

मैंने पायथन 3 में लिखे गए उत्तरदाता का उपयोग करने की भी कोशिश की है और सटीक समान संख्याएं प्राप्त की हैं। और भी, मैंने स्क्रिप्ट की एक वैकल्पिक जोड़ी लिखी, जहां मास्टर प्रक्रिया एक बच्चे की प्रक्रिया पैदा करेगी और stdout/stdin पर इसके साथ संवाद करेगी; मैंने प्रति सेकंड लगभग 750 संदेश प्राप्त किए (जब मैंने संदेश की लंबाई बढ़ा दी तो मुझे बहुत भिन्नता दिखाई नहीं दे रही थी), जो ज़ीरोम प्रयोग के समान गेंदबार्क की तरह है।

क्या इन नंबरों की अपेक्षा की जा सकती है? यहां सीमित कारक क्या है?

+3

सिंक्रोनस आरईक्यू-आरईपी मुख्य सीमा है, प्रदर्शन दर बढ़ाने के लिए अधिक असीमित उदाहरणों के लिए मार्गदर्शिका देखें। –

+0

सुनिश्चित नहीं है कि मैं आपको सही ढंग से समझता हूं, लेकिन इससे कोई फर्क नहीं पड़ता कि मैं कितने उत्तरदाता टर्मिनल खोलता हूं, अनुरोधकर्ता की रिपोर्ट दर हमेशा 900 एमपीएस रेंज में रहती है। अब अनुरोधकर्ता निश्चित रूप से अवरुद्ध नहीं कर रहा है, और यह जितना तेज़ हो सके अनुरोधों को भेजता है - जैसा कि नोडजेस पर जावास्क्रिप्ट के लिए, प्रति मिलीसेकंड से 1 अनुरोध से निश्चित रूप से तेज़ है? – flow

+1

आपके पास 'setInterval ... 1' है, इसका मतलब यह नहीं है कि यह केवल प्रत्येक मिलीसेकंड में एक संदेश भेज रहा है? इससे आपको 1k संदेश/सेकंड की ऊपरी सीमा मिल जाएगी। SetInterval को हटाएं, और अनुरोधकर्ता के लिए 'on' message'l ब्लॉक के अंदर socket.send डालें यदि आप वास्तव में इसकी सीमा देखना चाहते हैं। – minrk

उत्तर

7

मुझे लगता है कि दो चीजें चल रही हैं। सबसे पहले, आपके पास setInterval (-> socket.send 'helo world'), 1 है। यह प्रत्येक मिलीसेकंड का अनुरोध भेजता है, इसलिए आप प्रति सेकंड 1000 अनुरोध तक सीमित होने जा रहे हैं।

इसके अलावा, अनुरोध/प्रतिक्रिया मॉडल तुल्यकालिक है। एक प्रतिक्रिया दी जाती है जब तक एक सॉकेट और ब्लॉक पर एक अनुरोध आता है। प्रतिक्रिया के साथ, अगला अनुरोध संसाधित और अवरुद्ध है।

मैं socket.send 'helo world' while true को socket = zmq.socket 'push' और setInterval (-> socket.send 'helo world'), 0 को socket = zmq.socket 'req' से निवेदक स्क्रिप्ट बदल दिया है। मैं तो socket = zmq.socket 'pull' को प्रत्युत्तर स्क्रिप्ट socket = zmq.socket 'rep' बदल गया है और इस उत्पादन

$ 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 
... 

क्योंकि यह जबकि पाश पर अवरुद्ध किया गया निवेदक कोई उत्पादन मिल गया है, लेकिन यह प्रदर्शित करता है कि ØMQ तुलना में बेहतर प्रदर्शन कर सकते हैं।

संबंधित मुद्दे