Problem: enormous memory increase due to zero copy decoding

The zero copy decoding strategy implemented for 4.2.0 can lead to a large
increase of main memory usage in some cases (I have seen one program go up to
40G from 10G after upgrading from 4.1.4). This commit adds a new option to
contexts, called ZMQ_ZERO_COPY_RECV, which allows one to switch to the old
decoding strategy.
This commit is contained in:
Stefan Kaes
2018-03-05 13:19:20 +01:00
parent d54633add1
commit fcbd2a5710
16 changed files with 112 additions and 17 deletions

View File

@@ -405,8 +405,8 @@ void zmq::norm_engine_t::recv_data (NormObjectHandle object)
(NormRxStreamState *) NormObjectGetUserData (object);
if (NULL == rxState) {
// This is a new stream, so create rxState with zmq decoder, etc
rxState =
new (std::nothrow) NormRxStreamState (object, options.maxmsgsize);
rxState = new (std::nothrow)
NormRxStreamState (object, options.maxmsgsize, options.zero_copy);
errno_assert (rxState);
if (!rxState->Init ()) {
@@ -547,9 +547,10 @@ void zmq::norm_engine_t::recv_data (NormObjectHandle object)
} // end zmq::norm_engine_t::recv_data()
zmq::norm_engine_t::NormRxStreamState::NormRxStreamState (
NormObjectHandle normStream, int64_t maxMsgSize) :
NormObjectHandle normStream, int64_t maxMsgSize, bool zeroCopy) :
norm_stream (normStream),
max_msg_size (maxMsgSize),
zero_copy (zeroCopy),
in_sync (false),
rx_ready (false),
zmq_decoder (NULL),
@@ -582,7 +583,8 @@ bool zmq::norm_engine_t::NormRxStreamState::Init ()
if (NULL != zmq_decoder)
delete zmq_decoder;
// Note "in_batch_size" comes from config.h
zmq_decoder = new (std::nothrow) v2_decoder_t (in_batch_size, max_msg_size);
zmq_decoder =
new (std::nothrow) v2_decoder_t (in_batch_size, max_msg_size, zero_copy);
alloc_assert (zmq_decoder);
if (NULL != zmq_decoder) {
buffer_count = 0;