blob: 5475051c085515764ddf33b900c59c927ff22b54 [file] [log] [blame]
BenoƮt Ganneec4749a2020-09-18 10:05:37 +02001.. _memleak:
2
3*****************
4Memory leaks
5*****************
6
7Memory traces
8=============
9
10VPP supports memory traces to help debug (suspected) memory leaks. Each
11allocation/deallocation is instrumented so that the number of allocations and
12current global allocated size is maintained for each unique allocation stack
13trace.
14
15Looking at a memory trace can help diagnose where memory is (over-)used, and
16comparing memory traces at different point in time can help diagnose if and
17where memory leaks happen.
18
19To enable memory traces on main-heap:
20
21.. code-block:: console
22 $ vppctl memory-trace on main-heap
23
24To dump memory traces for analysis:
25
26.. code-block:: console
27 $ vppctl show memory-trace on main-heap
28 Thread 0 vpp_main
29 base 0x7fffb6422000, size 1g, locked, unmap-on-destroy, name 'main heap'
30 page stats: page-size 4K, total 262144, mapped 30343, not-mapped 231801
31 numa 0: 30343 pages, 118.53m bytes
32 total: 1023.99M, used: 115.49M, free: 908.50M, trimmable: 908.48M
33 free chunks 451 free fastbin blks 0
34 max total allocated 1023.99M
35
36 Bytes Count Sample Traceback
37 31457440 1 0x7fffbb31ad00 clib_mem_alloc_aligned_at_offset + 0x80
38 clib_mem_alloc_aligned + 0x26
39 alloc_aligned_8_8 + 0xe1
40 clib_bihash_instantiate_8_8 + 0x76
41 clib_bihash_init2_8_8 + 0x2ec
42 clib_bihash_init_8_8 + 0x6a
43 l2fib_table_init + 0x54
44 set_int_l2_mode + 0x89
45 int_l3 + 0xb4
46 vlib_cli_dispatch_sub_commands + 0xeee
47 vlib_cli_dispatch_sub_commands + 0xc62
48 vlib_cli_dispatch_sub_commands + 0xc62
49 266768 5222 0x7fffbd79f978 clib_mem_alloc_aligned_at_offset + 0x80
50 vec_resize_allocate_memory + 0xa8
51 _vec_resize_inline + 0x240
52 unix_cli_file_add + 0x83d
53 unix_cli_listen_read_ready + 0x10b
54 linux_epoll_input_inline + 0x943
55 linux_epoll_input + 0x39
56 dispatch_node + 0x336
57 vlib_main_or_worker_loop + 0xbf1
58 vlib_main_loop + 0x1a
59 vlib_main + 0xae7
60 thread0 + 0x3e
61 ....
62
63libc memory traces
64==================
65
66Internal VPP memory allocations rely on VPP main-heap, however when using
67external libraries, esp. in plugins (eg. OpenSSL library used by the IKEv2
68plugin), those external libraries usually manages memory using the standard
69libc malloc()/free()/... calls. This, in turn, makes use of the default
70libc heap.
71
72VPP has no knowledge of this heap and tools such as memory traces cannot be
73used.
74
75In order to enable the use of standard VPP debugging tools, this library
76replaces standard libc memory management calls with version using VPP
77main-heap.
78
79To use it, you need to use the `LD_PRELOAD` mechanism, eg.
80
81.. code-block:: console
82 ~# LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libvppmem_preload.so /usr/bin/vpp -c /etc/vpp/startup.conf
83
84You can then use tools such as memory traces as usual.