docs: convert plugins doc md->rst
[vpp.git] / docs / gettingstarted / 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
23     $ vppctl memory-trace on main-heap
24
25 To dump memory traces for analysis:
26
27 .. code-block:: console
28
29     $ vppctl show memory-trace on main-heap
30     Thread 0 vpp_main
31       base 0x7fffb6422000, size 1g, locked, unmap-on-destroy, name 'main heap'
32         page stats: page-size 4K, total 262144, mapped 30343, not-mapped 231801
33           numa 0: 30343 pages, 118.53m bytes
34         total: 1023.99M, used: 115.49M, free: 908.50M, trimmable: 908.48M
35           free chunks 451 free fastbin blks 0
36           max total allocated 1023.99M
37
38       Bytes    Count     Sample   Traceback
39      31457440        1 0x7fffbb31ad00 clib_mem_alloc_aligned_at_offset + 0x80
40                                       clib_mem_alloc_aligned + 0x26
41                                       alloc_aligned_8_8 + 0xe1
42                                       clib_bihash_instantiate_8_8 + 0x76
43                                       clib_bihash_init2_8_8 + 0x2ec
44                                       clib_bihash_init_8_8 + 0x6a
45                                       l2fib_table_init + 0x54
46                                       set_int_l2_mode + 0x89
47                                       int_l3 + 0xb4
48                                       vlib_cli_dispatch_sub_commands + 0xeee
49                                       vlib_cli_dispatch_sub_commands + 0xc62
50                                       vlib_cli_dispatch_sub_commands + 0xc62
51        266768     5222 0x7fffbd79f978 clib_mem_alloc_aligned_at_offset + 0x80
52                                       vec_resize_allocate_memory + 0xa8
53                                       _vec_resize_inline + 0x240
54                                       unix_cli_file_add + 0x83d
55                                       unix_cli_listen_read_ready + 0x10b
56                                       linux_epoll_input_inline + 0x943
57                                       linux_epoll_input + 0x39
58                                       dispatch_node + 0x336
59                                       vlib_main_or_worker_loop + 0xbf1
60                                       vlib_main_loop + 0x1a
61                                       vlib_main + 0xae7
62                                       thread0 + 0x3e
63     ....
64
65 libc memory traces
66 ==================
67
68 Internal VPP memory allocations rely on VPP main-heap, however when using
69 external libraries, esp. in plugins (e.g. OpenSSL library used by the IKEv2
70 plugin), those external libraries usually manages memory using the standard
71 libc malloc()/free()/... calls. This, in turn, makes use of the default
72 libc heap.
73
74 VPP has no knowledge of this heap and tools such as memory traces cannot be
75 used.
76
77 In order to enable the use of standard VPP debugging tools, this library
78 replaces standard libc memory management calls with version using VPP
79 main-heap.
80
81 To use it, you need to use the `LD_PRELOAD` mechanism, e.g.
82
83 .. code-block:: console
84
85     ~# LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libvppmem_preload.so /usr/bin/vpp -c /etc/vpp/startup.conf
86
87 You can then use tools such as memory traces as usual.