考慮以下兩個過程: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