PGM接收速度非常慢导致消息被丢弃?

时间:2014-08-09 01:12:08

标签: zeromq pgm-protocol

我正在调查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);
    }
}

2 个答案:

答案 0 :(得分:0)

每封邮件的大小是多少?

您没有使用OpenPGM,您正在使用所谓的ms-pgm(Microsoft的PGM实现)。

无论如何,您可能需要更改套接字的MulticastRate(默认为100kbit / s)。

您使用的是哪种网络?

答案 1 :(得分:0)

我遇到同样的问题,发件人每秒可以发送数千封邮件。但我的接收器每秒只能接收200条消息。

我认为这可能是发送或接收速度有限。我检查了

ZMQ_RATE: http://api.zeromq.org/3-0:zmq-setsockopt

中设置多播数据速率

The document screenshot

默认速率仅为100kb / s。

当我将其增加到1Gb / s时,现在一切正常。

const int rate = 1000000;                              // 1Gb TX- and RX- rate
m_socket.setsockopt(ZMQ_RATE, &rate, sizeof(rate));