ZMQ客户端 - 服务器 - 工作者性能

时间:2013-05-23 08:51:54

标签: performance zeromq inproc

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

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

情景:

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

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

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

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

基准2:(有10个工作人员,服务器只是作为经纪人)

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

来源:

有人可以通过添加带有一些工作线程的inproc-roundtrip来帮助我确定为什么TP会下降那么多吗?我真的期望用工作线程获得更高的TP。 ZMQ Inproc性能不是那么快吗?

1 个答案:

答案 0 :(得分:0)

您没有为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);