blob: 1afe7b2a29d85b201e8b2925a7abda7149009fef [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
Benoît Ganne34a19b22020-11-13 18:43:30 +010022
Benoît Ganneec4749a2020-09-18 10:05:37 +020023 $ vppctl memory-trace on main-heap
24
25To dump memory traces for analysis:
26
27.. code-block:: console
Benoît Ganne34a19b22020-11-13 18:43:30 +010028
Benoît Ganne70892fc2022-10-03 20:00:45 +020029 $ vppctl show memory main-heap verbose
Benoît Ganneec4749a2020-09-18 10:05:37 +020030 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
65libc memory traces
66==================
67
68Internal VPP memory allocations rely on VPP main-heap, however when using
Nathan Skrzypczak9ad39c02021-08-19 11:38:06 +020069external libraries, esp. in plugins (e.g. OpenSSL library used by the IKEv2
Benoît Ganneec4749a2020-09-18 10:05:37 +020070plugin), those external libraries usually manages memory using the standard
71libc malloc()/free()/... calls. This, in turn, makes use of the default
72libc heap.
73
74VPP has no knowledge of this heap and tools such as memory traces cannot be
75used.
76
77In order to enable the use of standard VPP debugging tools, this library
78replaces standard libc memory management calls with version using VPP
79main-heap.
80
Nathan Skrzypczak9ad39c02021-08-19 11:38:06 +020081To use it, you need to use the `LD_PRELOAD` mechanism, e.g.
Benoît Ganneec4749a2020-09-18 10:05:37 +020082
83.. code-block:: console
Benoît Ganne34a19b22020-11-13 18:43:30 +010084
Benoît Ganneec4749a2020-09-18 10:05:37 +020085 ~# LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libvppmem_preload.so /usr/bin/vpp -c /etc/vpp/startup.conf
86
87You can then use tools such as memory traces as usual.