[zeromq-dev] Big memory occupation with zmq_msg_init_data and zmq_msg_send after large number of packets transmitted

Luca Boccassi luca.boccassi at gmail.com
Wed May 3 14:49:26 CEST 2017


On Wed, 2017-05-03 at 09:56 +0000, Yan, Liming (Nokia - CN/Hangzhou)
wrote:
> Hi,
>    Anyone encountered this problem?  The process still occupies large
> physical memory when no any packets transmitting, after a turn of
> running of big traffic.  Seems some memory used by ZMQ not freed back
> to system. I'm wondering if this is normal or not?  Or anything wrong
> with me?  Thanks.
> 
> # ./zmq-mem-test -c -p 169.254.0.10 -l 512 -n 10000000
> Client started on tcp://169.254.0.10:5999.
> Actual sent msg count: 60000.
> 
> Total 9971945 freed in customized freer.
> 
> 20012 root      20   0 1950.1m 214.7m   0.0  1.8   0:05.03
> S              `- zmq-mem-test
> 20012 root      20   0 1950.1m 214.7m   0.0  1.8   0:05.03
> S              `- zmq-mem-test
> 
> The attached file is the example code with zero copy method
> zmq_msg_init_data and zmq_msg_send.  I'm just testing if all malloced
> memory from heap can be freed by asynchronous ZMQ handler. HWM is set
> with 30000 with no blocking sending, so many sending failed because
> of queue full.
> 
> ./zmq-mem-test -c -p 169.254.0.10 -l 512 -n 10000000
> ./zmq-mem-test -s -p 169.254.0.10
> 
> --------^_^--------
> Best Regards
> Yan Limin

Hi,

The test code has several errors:

1) It's passing a double pointer to zmq_ctx_shutdown and both
zmq_close, so they are not being called and lots of data is left
dangling
2) It's not initialising the zmq_msg_t in the server code before
calling zmq_msg_recv, so it's not actually receiving anything, add a
zmq_msg_init (&msg) before it
3) It's not calling zmq_ctx_term at the end. As the manpage of
zmq_ctx_shutdown says, that one is not mandatory and the _term is.

If you do these 3 changes then you'll see that Valgrind runs clean:

$ valgrind --leak-check=full ./test -c -p 127.0.0.1 -n 10000
==29787== Memcheck, a memory error detector
==29787== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==29787== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==29787== Command: ./lol -c -p 127.0.0.1 -n 10000
==29787== 
Client started on tcp://127.0.0.1:5999.
Actual sent msg count: 10000. 

Total 10000 freed in customized freer.
==29787== 
==29787== HEAP SUMMARY:
==29787==     in use at exit: 0 bytes in 0 blocks
==29787==   total heap usage: 20,243 allocs, 20,243 frees, 658,291,774 bytes allocated
==29787== 
==29787== All heap blocks were freed -- no leaks are possible
==29787== 
==29787== For counts of detected and suppressed errors, rerun with: -v
==29787== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

Kind regards,
Luca Boccassi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: This is a digitally signed message part
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20170503/722d00d4/attachment.sig>


More information about the zeromq-dev mailing list