Hi,

I am witnessing something in my system that I didn't expect. I am processing
data at a data rate of 100Mbps, with occasional peaks of 5s of data (=5 *
100Mbps) delivered as fast as possible because an internal buffer is
flushed. I use ZeroMQ internally, but I have to deliver the data on a TCP
plain socket at the endpoint of my system. Here, I use a ZMQ_STREAM socket
where clients connect. Basically, I keep track of connected clients and send
the data to all clients as a copy of the message. The main loop here looks
like
for(auto const& c: clientIdMessages) {
   bool eagain = !socket.send(c.copy(), ZMQ_DONTWAIT | ZMQ_SNDMORE);
   if (!eagain) {
      eagain = !socket.send(msg.copy(), ZMQ_DONTWAIT | ZMQ_SNDMORE);
   }
}

This usually works fine, but from time to time a message is skipped because
send returns with EAGAIN. If I understand the docs correctly, this happens
if the peer is unknown (ZMQ_STREAM behavior) or when the message cannot be
queued. I can exclude the first case, so I must a high HWM for sending
messages. However, I tried to increase the HWM to a huge value of 50 times
the expected message rate and it did not solve the problem. I also tried to
disable the HWM by setting it to 0, which means "no limit". Still, I am
getting an EAGAIN which I don't expect. 

I can exclude any previous loss because I have counters showing me that the
full data stream is delivered to the ZMQ_STREAM socket code above. I also
added an assertion on !eagain after sending, and this fires. Are there any
other conditions when I can get EAGAIN from a ZMQ_STREAM socket? 

Best wishes,
  Jens


---
Diese E-Mail wurde von Avast Antivirus-Software auf Viren geprüft.
https://www.avast.com/antivirus

_______________________________________________
zeromq-dev mailing list
zeromq-dev@lists.zeromq.org
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to