vpp: use vpp heap for libc
[vpp.git] / docs / troubleshooting / mem.rst
1 .. _memleak:
2
3 *****************
4 Memory leaks
5 *****************
6
7 Memory traces
8 =============
9
10 VPP supports memory traces to help debug (suspected) memory leaks. Each
11 allocation/deallocation is instrumented so that the number of allocations and
12 current global allocated size is maintained for each unique allocation stack
13 trace.
14
15 Looking at a memory trace can help diagnose where memory is (over-)used, and
16 comparing memory traces at different point in time can help diagnose if and
17 where memory leaks happen.
18
19 To enable memory traces on main-heap:
20
21 .. code-block:: console
22     $ vppctl memory-trace on main-heap
23
24 To 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
63 libc memory traces
64 ==================
65
66 Internal VPP memory allocations rely on VPP main-heap, however when using
67 external libraries, esp. in plugins (eg. OpenSSL library used by the IKEv2
68 plugin), those external libraries usually manages memory using the standard
69 libc malloc()/free()/... calls. This, in turn, makes use of the default
70 libc heap.
71
72 VPP has no knowledge of this heap and tools such as memory traces cannot be
73 used.
74
75 In order to enable the use of standard VPP debugging tools, this library
76 replaces standard libc memory management calls with version using VPP
77 main-heap.
78
79 To 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
84 You can then use tools such as memory traces as usual.