[zeromq-dev] zmq_poll performance question

Pieter Hintjens ph at imatix.com
Thu Nov 6 15:18:15 CET 2014


Oh, ok. Sounds like you have a good candidate for some before/after
measurement and optimization. Are you going to try to make a patch for
this?

On Thu, Nov 6, 2014 at 2:09 PM, Francis Le Bourse
<zno-reply-francis.lebourse at sfr-sh.fr> wrote:
>
> On 11/6/2014 11:47 AM, Pieter Hintjens wrote:
>>
>> A simple optimization is, when you are polling sockets for input, to
>> continue reading from an active socket using a non-blocking read. So
>> you process all waiting messages on a socket and then only switch back
>> to poll when needed.
>
> Thank you for you quick reply.
>
> Yes, but the question was more about the zmq_poll() internals.
> For 600+ file descriptors, zmq_poll() calls poll() a huge number of times
> for only a few that will trigger a POLLIN and the relevant information is
> already known / present in the pollfds array. The performance hit is there.
>
> Cheers,
> Francis
>
>
>
>>
>> On Thu, Nov 6, 2014 at 11:28 AM, Francis Le Bourse
>> <zno-reply-francis.lebourse at sfr-sh.fr> wrote:
>>>
>>> Hi,
>>>
>>> I am looking at a performance issue in zmq, when the number of zsockets /
>>> file descriptors becomes large.
>>> The relevant calls are:
>>>      poll+0x57
>>>      zmq_poll+0x2e3
>>>      zloop_start+0x1e8
>>>      main+0xb40
>>>      __libc_start_main+0xfd
>>> immediately followed by a loop of
>>>      poll+0x57
>>>      zmq::signaler_t::wait(int)+0x33
>>>      zmq::mailbox_t::recv(zmq::command_t*, int)+0x78
>>>      zmq::socket_base_t::process_commands(int, bool)+0xbe
>>>      zmq::socket_base_t::getsockopt(int, void*, unsigned long*)+0x135
>>>      zmq_getsockopt+0x75
>>>      zmq_poll+0x3da
>>>      zloop_start+0x1e8
>>>      main+0xb40
>>>      __libc_start_main+0xfd
>>>
>>> The code in the loop is executed once per file descriptor in the initial
>>> pollarray, redoing a poll() system call each time.
>>> Is there a reason to proceed that way ?
>>> Would be possible to reuse the results of the first poll() in order to
>>> bypass the second set of system calls ?
>>>
>>> Cheers,
>>> Francis
>>>
>>>
>>> _______________________________________________
>>> zeromq-dev mailing list
>>> zeromq-dev at lists.zeromq.org
>>> http://lists.zeromq.org/mailman/listinfo/zeromq-dev
>>>
>
>



More information about the zeromq-dev mailing list