【问题标题】:Why is this JeroMQ (ZeroMQ port) benchmark so slow?为什么这个 JeroMQ(ZeroMQ 端口)基准测试这么慢?
【发布时间】:2012-10-27 17:06:46
【问题描述】:

我想使用我找到的这个库,它是 zeromq 的纯 Java 端口(不是包装器)。 我正在尝试对其进行测试,虽然它claims 有一些不错的数字,但我正在执行的测试结果相当差,甚至在本地执行(客户端和在同一台机器上服务)。我确定这是我做错了。大约需要。 5 秒 来执行这 10.000 条消息循环。

我所做的只是采用 Hello world 示例并删除了暂停和系统输出。代码如下:

服务器:

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

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

【问题讨论】:

  • 其他人已经回答了如何获得更快的数字 - 通过做其他事情。我只想指出,您的数字绝对值不一定是坏的:平均每条往返消息 0.5 毫秒。作为往返的一部分,消息被解析为高级语言,并将其处理后的版本发回。将其与您进行简单 ICMP ping 得到的数字进行比较,您会感觉到 TCP、JeroMQ 和您的代码的开销。

标签: benchmarking messaging zeromq jeromq


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    请参考同步往返和异步往返的吞吐量测试

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

    异步比同步往返快 40 倍。

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

    【讨论】:

      猜你喜欢
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      相关资源
      最近更新 更多