为什么这个JeroMQ(ZeroMQ端口)基准测试如此之慢?

时间:2012-10-27 17:06:47

标签: benchmarking messaging zeromq jeromq

我想使用我发现的这个库,它是zeromq的纯java端口(不是包装器)。 我正在尝试测试它,虽然它claims有些好的数字,我正在执行的测试结果相当差,它甚至在本地执行(客户端并在同一台机器上运行)。我确定这是我做错了。需要约。 5秒执行此10.000消息循环。

我所做的只是采用Hello world示例并删除了暂停和sysouts。这是代码:

服务器:

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);            
        }              
    }
}

客户:

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();
    }
}

是否可以修复此代码并获得一些不错的数字?

2 个答案:

答案 0 :(得分:14)

你正在进行往返请求 - 回复,这与使用C ++ libzmq一样慢。在流式传输时,您只能在JeroQM,ZeroMQ或任何I / O上获得快速性能。

由于I / O和TCP的工作方式,往返速度很慢。在libzmq上,我们可以使用往返来执行大约20K消息/秒,使用流传输可以执行8M /秒。流式传输还有额外的优化,例如批处理,而往返请求 - 回复则无法做到。

对于吞吐量性能测试,从节点1向节点2发送10M消息,然后在获取时发回一个ACK。在ZeroMQ和JeroMQ上,您应该看到速度差异大约为3倍。

答案 1 :(得分:3)

请参考

的同步往返和异步往返之间的吞吐量测试

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

异步比同步往返快x40。

如果您想对jeromq的全速进行基准测试,请在您的环境中运行perf.LocalThr和perf.RemoteThr。