【问题标题】:ZMQ Clients - Server - Worker PerformanceZMQ 客户端 - 服务器 - 工作人员性能
【发布时间】:2013-05-18 13:13:12
【问题描述】:

我目前正在开发一个带有服务器的系统,它获取一些客户端的任务并处理它们。

由于我需要高吞吐量,我检查了 1Gbit 网络中往返/秒的速度。

场景:

  • 客户端有一个 Dealer 套接字并向服务器发送任务,服务器通过路由器套接字 (TCP-Connection) 接收任务
  • 服务器将任务转发到一个工作线程(经销商 - 通过 INPROC 的经销商)
  • 工作线程处理任务并以相同的方式发回响应

我在 16 台机器上使用了 16 个客户端作为基准测试。

基准 1:(没有工人,服务器将消息直接发送回客户端) 结果:

  • 1B-消息:143540,67 RT/s(RT = 往返)
  • 10B-消息:140160,72 RT/s
  • 100B-消息:129634,43 RT/s
  • 500B-消息:120977,5 RT/s
  • 1024B-消息:107983,59 RT/s

基准 2:(有 10 个工人,服务器只是充当代理)

  • 1B-消息:92873,51 RT/s(RT = 往返)
  • 10B-消息:81619,33 RT/s
  • 100B-消息:83606,02 RT/s
  • 500B-消息:75229,45 RT/s
  • 1024B-消息:63648,32 RT/s

来源:

有人可以帮助我确定为什么 TP 下降这么多,只需添加一个带有一些工作线程的 inproc-roundtrip 吗?我真的期望工作线程的 TP 更高。 ZMQ Inproc 性能不是那么快吗?

【问题讨论】:

    标签: performance zeromq inproc


    【解决方案1】:

    您没有为 ZMQ_ROUTER/ZMQ_DEALER 套接字使用正确的模式。

    伪代码是

    front = zmq_socket (context, ZMQ_ROUTER);
    zmq_bind(front, "tcp://*:15555");
    back = zmq_socket(context, ZMQ_DEALER);
    zmq_bind (back, "inproc://abc");
    // Here create thread
    zmq_proxy(front, back, NULL); // zmq_proxy will not return
    

    线程的伪代码是

    socket = zmq_socket(context, ZMQ_REP);
    zmq_connect(socket, "inproc://abc");
    do {
       zmq_recv(...)
       zmq_send(...)
    } while (1);
    

    客户端的伪代码是

    socket = zmq_socket(context, ZMQ_REQ);
    zmq_connect(socket, "tcp://127.0.0.1:15555");
    do {
       zmq_send(...)
       zmq_recv(...)
    } while (1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多