考虑以下两个过程:ZeroMQ REQ/REP性能
sender.cpp:
#include <zhelpers.h>
...
zmq::context_t ctx(1);
...
void foo(int i)
{
zmq::socket_t sender(ctx, ZMQ_REQ);
sender.connect("tcp://hostname:5000");
std::stringstream ss;
ss <<"bar_" <<i;
std::string bar_i(std::move(ss.str());
s_sendmore(sender, "foo ");
(i != N) ? s_send(sender, bar, 0) : s_send(sender, "done", 0);
s_recv(sender);
}
int main()
{
for(int i=0; i<=100000; ++i)
foo(i);
return 0;
}
receiver.cpp
#include <zhelpers.h>
...
int main()
{
zmq::context_t ctx(1);
zmq::socket_t rcv(ctx, ZMQ_REP);
rcv.bind("tcp://*:5000");
std::string s1("");
std::string s2("");
while(s2 != "done")
{
s1 = std::move(s_recv(rcv));
s2 = std::move(s_recv(rcv));
std::cout <<"received: " <<s1 <<" " <<s2 <<"\n";
s_send(rcv, "ACK");
}
return 0;
}
让我们先从两个过程。我会想到的是,接收器进程将接收方发送给它的所有信息,它会打印出:
foo bar_1
foo bar_2
...
等等,直到:
...
foo bar_100000
我预计它会做到这一点没有任何阻碍。
我的问题是,接收器总是围绕28215th迭代(总是围绕该数字!!!)并且阻塞直到一分钟左右。然后进一步到100000,但有时它会再次粘住。我的问题当然是:为什么会发生这种情况?我该如何解决它?
我试图把'发送者'放在全局范围内的foo(。)中,然后它就起作用了:在这种情况下,所有打印输出从1到100000顺利且超快速地进行,没有任何阻塞当然在这种情况下,每次调用foo(。)时都不会创建套接字)。但不幸的是,在我的代码中,我无法做到这一点。
我想了解为什么会出现此块。
最大套接字可能在服务器端受到限制。尝试增加它可能会解决它。因为tcp需要花费时间来清理死亡套接字,并且你有很多这种情况会触发最大数量的套接字。 – somdoron