[zeromq-dev] Getting rid of low watermark

Martin Sustrik sustrik at 250bpm.com
Tue May 25 15:05:32 CEST 2010

Ok, committed to the trunk.

ZMQ_LWM is still defined so that bindings don't break.

However, attempt to set LWM on a socket would result in EINVAL error.


Martin Sustrik wrote:
> Hi all,
> Currently, when setting limit for number of messages that can be held by 
>  a socket you have to specify high & low watermarks.
> Here's what documentation says:
> "The ZMQ_HWM option shall set the high water mark for the message queue 
> associated with the socket. The high water mark is a hard limit on the 
> number of outstanding messages in the queue; if this
>        limit has been reached the socket shall enter an "emergency" 
> state and depending on the socket type, 0MQ shall take appropriate 
> action such as blocking or dropping new messages entering the
>        queue."
> "The ZMQ_LWM option shall set the low water mark for the message queue 
> associated with the socket. This option only makes sense when used in 
> conjunction with the ZMQ_HWM option. A socket which
>        has reached it’s high water mark remains in the "emergency" state 
> until the number of outstanding messages in it’s associated message 
> queue falls below the low water mark, at which point normal
>        message processing is resumed."
> As far as I understand -- correct me if I am wrong -- it's not obvious 
> what value LWM should be set to and it's not even clear why the user 
> should bother with setting LWM at all.
> Given the above, I would like to propose an algorithm for automatic 
> setting of LWM.
> Following three points are to be considered:
> 1. LWM has to be less than HWM.
> 2. LWM cannot be set to very low value (such as zero) as after filling 
> the queue it would start to refill only after all the messages are read 
> from it and thus unnecessarily hold the progress back.
> 3. LWM cannot be set to very high value (such as HWM-1) as it would 
> result in lock-step filling of the queue -- if a single message is read 
> from a full queue, writer thread is resumed to write exactly one message 
> to the queue and go back to sleep immediately. This would result in low 
> performance.
> Given the 3) it would be good to keep HWM and LWM as far apart as to 
> reduce the thread switching overhead to almost zero, say HWM-LWM should 
> be 500.
> Still we have to account for the cases where HWM<500 thus driving LWM to 
> negative numbers. My suggestion is to make LWM one half of HWM in such 
> cases.
> The graph showing resulting HWM/LWMs is attached.
> Thoughts?
> Martin
> ------------------------------------------------------------------------
> ------------------------------------------------------------------------
> _______________________________________________
> 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