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

6
我发现了一个纯Java移植版的zeromq库,想要使用它。尽管它声称在某些方面表现不错,但我进行的测试结果很差,即使是在本地(客户端和服务器在同一台机器上)。我确定是我做错了什么。执行这个10,000条信息循环需要大约5秒钟
我只是拿了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();
    }
}

这段代码能否修复并获得一些合理的数字?

其他人已经回答了如何获得更快的数字 - 通过做其他事情。我只想指出,就绝对值而言,您的数字不一定很差:平均每个往返消息需要0.5毫秒。作为往返的一部分,消息被解析成高级语言,并发送回其处理后的版本。将其与执行简单的ICMP ping时获得的数字进行比较,您就可以感受到TCP、JeroMQ和您的代码的开销。 - Evgeniy Berezovsky
2个回答

15

你正在进行往返请求回复,并且使用C++ libzmq也同样会很慢。只有在执行流媒体操作时,例如使用JeroQM、ZeroMQ或任何I/O时,才能获得快速性能。

由于I/O和TCP的工作方式,往返请求回复的速度较慢。在libzmq上,使用往返请求回复大约可以处理 20K 条消息/秒,而使用流媒体时则可达到每秒处理 8M 条消息。流媒体还具有批处理等额外优化,这些操作在往返请求回复中是无法实现的。

如果要进行吞吐性能测试,请从节点1向节点2发送 1000 万条消息,然后在收到它们时发送单个确认。在ZeroMQ和JeroMQ上测试,应该会看到速度差异约为 3 倍。


4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接