2013-06-11 30 views
3

我正在使用ZeroMQ 3.2.3和CZmq 1.4.1。我嘗試了「Hello world」示例。該示例(https://github.com/imatix/zguide/tree/master/examples/C)在使用10個併發客戶端時,允許我在本地主機(Ubuntu 13.04)上的Intel i7(8 GB RAM,共8個內核)上每秒最多交換12500條消息。提高ZeroMQ REQ/REP性能

我讀了ZeroMQ可以處理更多。我做錯了什麼,或者錯過了什麼?

下面是示例代碼:

// Hello World server 

#include <zmq.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <string.h> 
#include <assert.h> 

int main (void) 
{ 
    // Socket to talk to clients 
    void *context = zmq_ctx_new(); 
    void *responder = zmq_socket (context, ZMQ_REP); 
    int rc = zmq_bind (responder, "tcp://*:5555"); 
    assert (rc == 0); 

    while (1) { 
     char buffer [10]; 
     zmq_recv (responder, buffer, 10, 0); 
     //printf ("Received Hello\n"); 
     zmq_send (responder, "World", 5, 0); 
     //usleep (1);   // Do some 'work' 
    } 
    return 0; 
} 



// Hello World client 
#include <zmq.h> 
#include <string.h> 
#include <stdio.h> 
#include <unistd.h> 

int main (void) 
{ 
    printf ("Connecting to hello world server...\n"); 
    void *context = zmq_ctx_new(); 
    void *requester = zmq_socket (context, ZMQ_REQ); 
    zmq_connect (requester, "tcp://localhost:5555"); 

    int request_nbr; 
    for (request_nbr = 0; request_nbr != 100000; request_nbr++) { 
     char buffer [10]; 
//  printf ("Sending Hello %d...\n", request_nbr); 
     zmq_send (requester, "Hello", 5, 0); 
     zmq_recv (requester, buffer, 10, 0); 
//  printf ("Received World %d\n", request_nbr); 
    } 
    zmq_close (requester); 
    zmq_ctx_destroy (context); 
    return 0; 
} 

謝謝!

回答

6

您遇到的瓶頸是因爲您不是異步簡化您的溝通。

嘗試用異步ROUTER <-> DEALER模式替換您的同步REQ <-> REP模式。

這可以更快的原因是,如果客戶端可以發送連續的請求,而無需等待之間的每個響應。處理單個請求/答覆的成本有兩個部分:

  1. 發送消息「在導線」的成本
  2. 上請求和/或操作的方式處理的成本客戶端和服務器
  3. 上回復

當您運行大量連續請求時,異步模式有助於極大地降低(2)的成本。

+0

我明白了。所以,現在假設我希望客戶端在服務器發回「STOP」後立即停止發送請求,例如,ROUTER <-> DEALER模式不可能,因爲可能已經發送了一些額外的請求? – SCO

+1

@SCO不,這不是不可能的。您可以這樣做:當客戶端收到「停止」時,它停止發送來自該點的請求。當服務器發送「停止」時,它只是忽略從該點接收到的任何請求。 –

+0

這看起來不錯。然後看看ROUTER/DEALER的例子!謝謝 ! – SCO