[zeromq-dev] using majordomo broker with asynchronous clients
Vishal Ahuja
vahuja4 at gmail.com
Thu Dec 11 10:40:17 CET 2014
I removed the printfs, and increased the TCP send and receive buffers to
the max possible. When I have two clients (running in parallel) sending
100k messages, there is no packet loss. But when I increase the number of
clients to three, then each client receives around 93k packets. Also, the
majordomo specification (http://rfc.zeromq.org/spec:7) says that the broker
should be able to switch millions of messages per second, whereas I seeing
a throughput of around 30k messages per second. Can someone tell how to
improve the throughput?
Sincerely,
Vishal
On Thu, Dec 11, 2014 at 10:37 AM, Andre Caron <andre.l.caron at gmail.com>
wrote:
> The broker uses a router socket, which silently drops outbound messages
> when the sndhwm is reached. If your client is reading more slowly than the
> broker is writing, you'll lose messages.
>
> In your case, the slow part is writing to the terminal. Try removing the
> printf in the recv loop and you should lose fewer messages.
>
> André
>
> > On Dec 10, 2014, at 9:40 PM, Vishal Ahuja <vahuja4 at gmail.com> wrote:
> >
> > While reading the zeromq guide, I came across client code (pertaining to
> the majordomo pattern) which sends 100k requests in a loop, and then
> receives the reply in a second loop.
> >
> > #include "../include/mdp.h"
> > #include <time.h>
> >
> >
> > int main (int argc, char *argv [])
> > {
> > int verbose = (argc > 1 && streq (argv [1], "-v"));
> > mdp_client_t *session = mdp_client_new ("tcp://localhost:5555",
> verbose);
> > int count;
> > for (count = 0; count < 100000; count++) {
> > zmsg_t *request = zmsg_new ();
> > zmsg_pushstr (request, "Hello world");
> > mdp_client_send (session, "echo", &request);
> > }
> > printf("sent all\n");
> >
> > for (count = 0; count < 100000; count++) {
> > zmsg_t *reply = mdp_client_recv (session,NULL,NULL);
> > if (reply)
> > zmsg_destroy (&reply);
> > else
> > break; // Interrupted by Ctrl-C
> > printf("reply received:%d\n", count);
> > }
> > printf ("%d replies received\n", count);
> > mdp_client_destroy (&session);
> > return 0;
> > }
> >
> > I have added a counter to count the number of replies that the worker
> (test_worker.c) sends to the broker, and another counter in mdp_broker.c to
> count the number of replies the broker sends to a client. Both of these
> count up to 100k, but the client is receiving only around 37k replies.
> >
> > If the number of client requests is set to around 40k, then it receives
> all the replies. Can someone please tell me why packets are lost when the
> client sends more than 40k asynchronous requests?
> >
> > I tried setting the HWM to 100k for the broker socket, but the problem
> persists:
> >
> > static broker_t *
> > s_broker_new (int verbose)
> > {
> > broker_t *self = (broker_t *) zmalloc (sizeof (broker_t));
> > int64_t hwm = 100000;
> > // Initialize broker state
> > self->ctx = zctx_new ();
> > self->socket = zsocket_new (self->ctx, ZMQ_ROUTER);
> > zmq_setsockopt(self->socket, ZMQ_SNDHWM, &hwm, sizeof(hwm));
> >
> > zmq_setsockopt(self->socket, ZMQ_RCVHWM, &hwm, sizeof(hwm));
> > self->verbose = verbose;
> > self->services = zhash_new ();
> > self->workers = zhash_new ();
> > self->waiting = zlist_new ();
> > self->heartbeat_at = zclock_time () + HEARTBEAT_INTERVAL;
> > return self;
> > }
> >
> > Vishal
> > _______________________________________________
> > zeromq-dev mailing list
> > zeromq-dev at lists.zeromq.org
> > http://lists.zeromq.org/mailman/listinfo/zeromq-dev
> _______________________________________________
> zeromq-dev mailing list
> zeromq-dev at lists.zeromq.org
> http://lists.zeromq.org/mailman/listinfo/zeromq-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20141211/a4c2a1ec/attachment.htm>
More information about the zeromq-dev
mailing list