我正在调查ZeroMQ的PGM支持。 在Windows上运行(在使用MacOS作为主机的VirtualBox中,如果这可能很重要),使用NetMQ库。
我想做的测试非常简单:尽可能快地从A发送消息到 ......
首先我使用TCP作为传输;这很容易达到每秒150,000条消息,两台接收机保持同步。 然后我想测试PGM;我所做的就是更换地址" tcp:// *:5556"与" pgm://239.0.0.1:5557"在双方。
现在,PGM测试给出了非常奇怪的结果:发送者很容易达到> 200 000条消息/秒;接收器虽然设法只处理大约500条消息/秒!?
所以,我不明白发生了什么。 在减慢发送者的速度之后(在每条消息后10ms睡觉,否则它几乎不可能调查流量)在我看来接收器正试图跟上,最初看到每个消息经过,然后窒息,未命中一系列消息,然后试图再次跟上...... 我使用了HWM和恢复间隔设置,但这似乎没什么区别(?!)。
任何人都能解释一下发生了什么吗?
非常感谢, 弗雷德里克
注意:不确定是否重要:据我所知,我不使用OpenPGM - 我只是下载ZeroMQ设置,并启用了“多播支持”功能。在Windows中。
这是发件人代码:
class MassSender
{
private const string TOPIC_PREFIX = "Hello:";
private static int messageCounter = 0;
private static int timerCounter = 0;
public static void Main(string[] args)
{
Timer timer = new Timer(1000);
timer.Elapsed += timer_Elapsed;
SendMessages_0MQ_NetMQ(timer);
}
private static void SendMessages_0MQ_NetMQ(Timer timer)
{
using (NetMQContext context = NetMQContext.Create())
{
using (NetMQSocket publisher = context.CreateSocket(ZmqSocketType.Pub))
{
//publisher.Bind("tcp://*:5556");
publisher.Bind("pgm://239.0.0.1:5557"); // IP of interface is not specified so use default interface.
timer.Start();
while (true)
{
string message = GetMessage();
byte[] body = Encoding.UTF8.GetBytes(message);
publisher.Send(body);
}
}
}
}
private static string GetMessage()
{
return TOPIC_PREFIX + "Message " + (++messageCounter).ToString();
}
static void timer_Elapsed(object sender, ElapsedEventArgs e)
{
Console.WriteLine("=== SENT {0} MESSAGES SO FAR - TOTAL AVERAGE IS {1}/s ===", messageCounter, messageCounter / ++timerCounter);
}
}
和接收者:
class MassReceiver
{
private const string TOPIC_PREFIX = "Hello:";
private static int messageCounter = 0;
private static int timerCounter = 0;
private static string lastMessage = String.Empty;
static void Main(string[] args)
{
// Assume that sender and receiver are started simultaneously.
Timer timer = new Timer(1000);
timer.Elapsed += timer_Elapsed;
ReceiveMessages_0MQ_NetMQ(timer);
}
private static void ReceiveMessages_0MQ_NetMQ(Timer timer)
{
using (NetMQContext context = NetMQContext.Create())
{
using (NetMQSocket subscriber = context.CreateSocket(ZmqSocketType.Sub))
{
subscriber.Subscribe(""); // Subscribe to everything
//subscriber.Connect("tcp://localhost:5556");
subscriber.Connect("pgm://239.0.0.1:5557"); // IP of interface is not specified so use default interface.
timer.Start();
while (true)
{
messageCounter++;
byte[] body = subscriber.Receive();
string message = Encoding.UTF8.GetString(body);
lastMessage = message; // Only show message when timer elapses, otherwise throughput drops dramatically.
}
}
}
}
static void timer_Elapsed(object sender, ElapsedEventArgs e)
{
Console.WriteLine("=== RECEIVED {0} MESSAGES SO FAR - TOTAL AVERAGE IS {1}/s === (Last: {2})", messageCounter, messageCounter / ++timerCounter, lastMessage);
}
}
答案 0 :(得分:0)
每封邮件的大小是多少?
您没有使用OpenPGM,您正在使用所谓的ms-pgm(Microsoft的PGM实现)。
无论如何,您可能需要更改套接字的MulticastRate(默认为100kbit / s)。
您使用的是哪种网络?
答案 1 :(得分:0)
我遇到同样的问题,发件人每秒可以发送数千封邮件。但我的接收器每秒只能接收200条消息。
我认为这可能是发送或接收速度有限。我检查了
ZMQ_RATE:
在http://api.zeromq.org/3-0:zmq-setsockopt
默认速率仅为100kb / s。
当我将其增加到1Gb / s时,现在一切正常。
const int rate = 1000000; // 1Gb TX- and RX- rate
m_socket.setsockopt(ZMQ_RATE, &rate, sizeof(rate));