I didn't know that you only have Linux... therefore I have rewritten the 
WeatherUpdate demo of the Guide to show the behavior. It sends 1000 
messages via PUB/SUB and the Sleeptime adds a sleep after each send. This 
results in the following times:

Average sending time in iteration    0, messages    0-  10 [ms]:   1
Average sending time in iteration    1, messages   10-  20 [ms]:   0
Average sending time in iteration    2, messages   20-  30 [ms]:   1
Average sending time in iteration    3, messages   30-  40 [ms]:   0
Average sending time in iteration    4, messages   40-  50 [ms]:   0
Average sending time in iteration    5, messages   50-  60 [ms]:   1
Average sending time in iteration    6, messages   60-  70 [ms]:   0
Average sending time in iteration    7, messages   70-  80 [ms]:   1
Average sending time in iteration    8, messages   80-  90 [ms]:   0
Average sending time in iteration    9, messages   90- 100 [ms]:   3
Average sending time in iteration   10, messages  100- 110 [ms]:   5
Average sending time in iteration   11, messages  110- 120 [ms]:   5
Average sending time in iteration   12, messages  120- 130 [ms]:   5
Average sending time in iteration   13, messages  130- 140 [ms]:   5
Average sending time in iteration   14, messages  140- 150 [ms]:   6
Average sending time in iteration   15, messages  150- 160 [ms]:   5
Average sending time in iteration   16, messages  160- 170 [ms]:   6
Average sending time in iteration   17, messages  170- 180 [ms]:   5
Average sending time in iteration   18, messages  180- 190 [ms]:   6
Average sending time in iteration   19, messages  190- 200 [ms]:   5
Average sending time in iteration   20, messages  200- 210 [ms]:   6
Average sending time in iteration   21, messages  210- 220 [ms]:   5
Average sending time in iteration   22, messages  220- 230 [ms]:   7
Average sending time in iteration   23, messages  230- 240 [ms]:   7
Average sending time in iteration   24, messages  240- 250 [ms]:  11
Average sending time in iteration   25, messages  250- 260 [ms]:  10
Average sending time in iteration   26, messages  260- 270 [ms]:  10
Average sending time in iteration   27, messages  270- 280 [ms]:  10
Average sending time in iteration   28, messages  280- 290 [ms]:  10
Average sending time in iteration   29, messages  290- 300 [ms]:  10
Average sending time in iteration   30, messages  300- 310 [ms]:  10
Average sending time in iteration   31, messages  310- 320 [ms]:  10
Average sending time in iteration   32, messages  320- 330 [ms]:  11
Average sending time in iteration   33, messages  330- 340 [ms]:  10
Average sending time in iteration   34, messages  340- 350 [ms]:  11
Average sending time in iteration   35, messages  350- 360 [ms]:  13
Average sending time in iteration   36, messages  360- 370 [ms]:  14
Average sending time in iteration   37, messages  370- 380 [ms]:  15
Average sending time in iteration   38, messages  380- 390 [ms]:  15
Average sending time in iteration   39, messages  390- 400 [ms]:  15
Average sending time in iteration   40, messages  400- 410 [ms]:  15
Average sending time in iteration   41, messages  410- 420 [ms]:  16
Average sending time in iteration   42, messages  420- 430 [ms]:  15
Average sending time in iteration   43, messages  430- 440 [ms]:  16
Average sending time in iteration   44, messages  440- 450 [ms]:  15
Average sending time in iteration   45, messages  450- 460 [ms]:  16
Average sending time in iteration   46, messages  460- 470 [ms]:  16
Average sending time in iteration   47, messages  470- 480 [ms]:  17
Average sending time in iteration   48, messages  480- 490 [ms]:  19
Average sending time in iteration   49, messages  490- 500 [ms]:  20
Average sending time in iteration   50, messages  500- 510 [ms]:  20
Average sending time in iteration   51, messages  510- 520 [ms]:   3
Average sending time in iteration   52, messages  520- 530 [ms]:   0
Average sending time in iteration   53, messages  530- 540 [ms]:   0
Average sending time in iteration   54, messages  540- 550 [ms]:   0
Average sending time in iteration   55, messages  550- 560 [ms]:   0
Average sending time in iteration   56, messages  560- 570 [ms]:   0
Average sending time in iteration   57, messages  570- 580 [ms]:   0
Average sending time in iteration   58, messages  580- 590 [ms]:   0
Average sending time in iteration   59, messages  590- 600 [ms]:   0
Average sending time in iteration   60, messages  600- 610 [ms]:   0
Average sending time in iteration   61, messages  610- 620 [ms]:   0
Average sending time in iteration   62, messages  620- 630 [ms]:   0
Average sending time in iteration   63, messages  630- 640 [ms]:   0
Average sending time in iteration   64, messages  640- 650 [ms]:   0
Average sending time in iteration   65, messages  650- 660 [ms]:   0
Average sending time in iteration   66, messages  660- 670 [ms]:   0


There is a latency ramp from message 90 on up to message 510. After 510, 
the latency is smaller. I had to measure 10 messages together because of 
the timer accuracy of 1 ms to get measurable results.


To test this on linux, you just need to modify the lines
        _beginthread( StartSubscriber, 0, context );
and
        #include <process.h>

Ihope this helps to reproduce the issue.



#include "stdafx.h"
#include "zhelpers.h"
#include <process.h>


void StartSubscriber(void* context)
{
    void* subscriber = zmq_socket (context, ZMQ_SUB);

    int rc = zmq_connect (subscriber, "inproc://weather");
    assert (rc == 0);

    //  Subscribe to zipcode, default is NYC, 10001
    char *filter = "10001";
    rc = zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, filter, strlen 
(filter));
    assert (rc == 0);

    //  Process 1000 updates
    int update_nbr;
    long total_temp = 0;
    for (update_nbr = 0; update_nbr < 1000; update_nbr++) {
        char *string = s_recv (subscriber);

        int zipcode, temperature, relhumidity;
        sscanf (string, "%d %d %d",&zipcode, &temperature, &relhumidity);
        total_temp += temperature;
        free (string);
    }
    printf ("Average temperature for zipcode '%s' was %dF\n", filter, (int
) (total_temp / update_nbr));

    zmq_close (subscriber);
}

int _tmain(int argc, _TCHAR* argv[])
{
    //  Prepare our context and publisher
    void *context = zmq_ctx_new ();
    void *publisher = zmq_socket (context, ZMQ_PUB);
 
 

    int rc = zmq_bind (publisher, "inproc://weather");
    assert (rc == 0);

    _beginthread( StartSubscriber, 0, context );

    s_sleep(1000);

    int64_t start=0;
    int64_t stop=0;

    int Sleeptime = 10;

    for(int it=0; it<100; it++)
    {
        char update [20];
        sprintf (update, "%05d %d %d", 10001, 2, 3);
 
        start = s_clock();

        for(int i=0; i<10; i++)
        {
            s_send (publisher, update);

            s_sleep(Sleeptime);
        }
        stop = s_clock();

        printf ("Average sending time in iteration %4d, messages %4d-%4d 
[ms]: %3d\n", it, it*10, it*10+10 , stop-start-10*Sleeptime);
    }

    s_sleep(1000);

    zmq_close (publisher);
    zmq_ctx_destroy (context);

    return 0;
}




Von:    Pieter Hintjens <[email protected]>
An:     ZeroMQ development list <[email protected]>, 
Datum:  12.10.2015 15:04
Betreff:        Re: [zeromq-dev] Bad ZMQ latency on first 500 messages per 
connection
Gesendet von:   [email protected]



On Mon, Oct 12, 2015 at 2:47 PM,  <[email protected]> 
wrote:

> We have sent you the C source code in the last message as asked. Could 
you
> reproduce the issues?

That source code requires Windows. Also, it is not minimal (700 lines
of code). If you want us to port it to Linux and try to reproduce the
case, that will take time and we'd expect to invoice the work.

-
Pieter Hintjens
iMatix
_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to