2012-10-27 13 views
5

Vorrei usare questa libreria che ho trovato, è una pura porta java (non un wrapper) di zeromq. Sto provando a testarlo e mentre è claims alcuni buoni numeri, il test che sto eseguendo sta dando risultati piuttosto scadenti e viene persino eseguito localmente (client e servizio sulla stessa macchina). Sono sicuro che sia qualcosa che sto sbagliando. Ci vogliono circa 5 secondi per eseguire questo ciclo di 10.000 messaggi.Perché questo benchmark JeroMQ (porta ZeroMQ) è lento?

Tutto ciò che ho fatto è prendere l'esempio Hello world e rimosso pause e sysouts. Ecco il codice:

Server:

package guide; 

import org.jeromq.ZMQ; 

public class hwserver{ 
    public static void main(String[] args) throws Exception{ 

     // Prepare our context and socket 
     ZMQ.Context context = ZMQ.context(1); 
     ZMQ.Socket socket = context.socket(ZMQ.REP); 

     System.out.println("Binding hello world server"); 
     socket.bind ("tcp://*:5555");   

     while (true) {     
      byte[] reply = socket.recv(0); 
      String requestString = "Hello" ; 
      byte[] request = requestString.getBytes();    
      socket.send(request, 0);    
     }    
    } 
} 

Il Cliente:

package guide; 

import org.jeromq.ZMQ; 

public class hwclient{ 
    public static void main(String[] args){ 
     ZMQ.Context context = ZMQ.context(1); 
     ZMQ.Socket socket = context.socket(ZMQ.REQ); 
     socket.connect ("tcp://localhost:5555"); 

     System.out.println("Connecting to hello world server"); 

     long start = System.currentTimeMillis(); 
     for(int request_nbr = 0; request_nbr != 10_000; request_nbr++) { 
      String requestString = "Hello" ; 
      byte[] request = requestString.getBytes();   
      socket.send(request, 0); 
      byte[] reply = socket.recv(0);   
     } 
     long end = System.currentTimeMillis(); 
     System.out.println(end-start); 
     socket.close(); 
     context.term(); 
    } 
} 

È è possibile fissare questo codice e ottenere alcuni numeri decenti?

+0

Altri hanno risposto come ottenere numeri più veloci - facendo qualcos'altro. Voglio solo far notare che i tuoi numeri, in termini assoluti, non sono necessariamente negativi: in media 0,5 ms per messaggio con risposta circolare. E come parte del roundtrip, il messaggio viene analizzato in un linguaggio di alto livello e una versione elaborata viene inviata indietro. Confrontalo con le cifre ottenendo un semplice ping ICMP, e ti rendi conto del sovraccarico di TCP, JeroMQ e del tuo codice. –

risposta

13

Si sta eseguendo una risposta-risposta di andata e ritorno, e questo sarà altrettanto lento utilizzando il libzmq C++. Durante lo streaming otterrai solo prestazioni veloci su JeroQM, ZeroMQ o qualsiasi I/O.

Lo sgancio a rotazione è lento a causa di come I/O e TCP funzionano. Su libzmq possiamo fare circa 20K messaggi al secondo usando il round-trip e 8M/sec usando lo streaming. Lo streaming ha ulteriori ottimizzazioni come il batching che non puoi fare con la risposta-risposta di andata e ritorno.

Per un test delle prestazioni di throughput, inviare 10 M messaggi dal nodo 1 al nodo 2, quindi inviare un singolo ACK quando li si riceve. Tempo su ZeroMQ e su JeroMQ, dovresti vedere circa 3 volte la differenza di velocità.

3

prega di fare riferimento alla prova di trasmissione tra sincrono di andata e ritorno e asincrona di andata e ritorno a

https://github.com/zeromq/jeromq/blob/master/src/test/java/guide/tripping.java

L'asincrono era x40 più veloce rispetto al sincrono di andata e ritorno.

Se si desidera eseguire il benchmark dell'intera velocità di jeromq, eseguire perf.LocalThr e perf.RemoteThr sul proprio ambiente.