doc: add a restriction to multi-process support
[dpdk.git] / doc / guides / prog_guide / multi_proc_support.rst
1 ..  BSD LICENSE
2     Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
3     All rights reserved.
4
5     Redistribution and use in source and binary forms, with or without
6     modification, are permitted provided that the following conditions
7     are met:
8
9     * Redistributions of source code must retain the above copyright
10     notice, this list of conditions and the following disclaimer.
11     * Redistributions in binary form must reproduce the above copyright
12     notice, this list of conditions and the following disclaimer in
13     the documentation and/or other materials provided with the
14     distribution.
15     * Neither the name of Intel Corporation nor the names of its
16     contributors may be used to endorse or promote products derived
17     from this software without specific prior written permission.
18
19     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22     A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23     OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25     LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31 .. _Multi-process_Support:
32
33 Multi-process Support
34 =====================
35
36 In the DPDK, multi-process support is designed to allow a group of DPDK processes
37 to work together in a simple transparent manner to perform packet processing,
38 or other workloads.
39 To support this functionality,
40 a number of additions have been made to the core DPDK Environment Abstraction Layer (EAL).
41
42 The EAL has been modified to allow different types of DPDK processes to be spawned,
43 each with different permissions on the hugepage memory used by the applications.
44 For now, there are two types of process specified:
45
46 *   primary processes, which can initialize and which have full permissions on shared memory
47
48 *   secondary processes, which cannot initialize shared memory,
49     but can attach to pre- initialized shared memory and create objects in it.
50
51 Standalone DPDK processes are primary processes,
52 while secondary processes can only run alongside a primary process or
53 after a primary process has already configured the hugepage shared memory for them.
54
55 .. note::
56
57     Secondary processes should run alongside primary process with same DPDK version.
58
59 To support these two process types, and other multi-process setups described later,
60 two additional command-line parameters are available to the EAL:
61
62 *   ``--proc-type:`` for specifying a given process instance as the primary or secondary DPDK instance
63
64 *   ``--file-prefix:`` to allow processes that do not want to co-operate to have different memory regions
65
66 A number of example applications are provided that demonstrate how multiple DPDK processes can be used together.
67 These are more fully documented in the "Multi- process Sample Application" chapter
68 in the *DPDK Sample Application's User Guide*.
69
70 Memory Sharing
71 --------------
72
73 The key element in getting a multi-process application working using the DPDK is to ensure that
74 memory resources are properly shared among the processes making up the multi-process application.
75 Once there are blocks of shared memory available that can be accessed by multiple processes,
76 then issues such as inter-process communication (IPC) becomes much simpler.
77
78 On application start-up in a primary or standalone process,
79 the DPDK records to memory-mapped files the details of the memory configuration it is using - hugepages in use,
80 the virtual addresses they are mapped at, the number of memory channels present, etc.
81 When a secondary process is started, these files are read and the EAL recreates the same memory configuration
82 in the secondary process so that all memory zones are shared between processes and all pointers to that memory are valid,
83 and point to the same objects, in both processes.
84
85 .. note::
86
87     Refer to `Multi-process Limitations`_ for details of
88     how Linux kernel Address-Space Layout Randomization (ASLR) can affect memory sharing.
89
90 .. _figure_multi_process_memory:
91
92 .. figure:: img/multi_process_memory.*
93
94    Memory Sharing in the DPDK Multi-process Sample Application
95
96
97 The EAL also supports an auto-detection mode (set by EAL ``--proc-type=auto`` flag ),
98 whereby an DPDK process is started as a secondary instance if a primary instance is already running.
99
100 Deployment Models
101 -----------------
102
103 Symmetric/Peer Processes
104 ~~~~~~~~~~~~~~~~~~~~~~~~
105
106 DPDK multi-process support can be used to create a set of peer processes where each process performs the same workload.
107 This model is equivalent to having multiple threads each running the same main-loop function,
108 as is done in most of the supplied DPDK sample applications.
109 In this model, the first of the processes spawned should be spawned using the ``--proc-type=primary`` EAL flag,
110 while all subsequent instances should be spawned using the ``--proc-type=secondary`` flag.
111
112 The simple_mp and symmetric_mp sample applications demonstrate this usage model.
113 They are described in the "Multi-process Sample Application" chapter in the *DPDK Sample Application's User Guide*.
114
115 Asymmetric/Non-Peer Processes
116 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
117
118 An alternative deployment model that can be used for multi-process applications
119 is to have a single primary process instance that acts as a load-balancer or
120 server distributing received packets among worker or client threads, which are run as secondary processes.
121 In this case, extensive use of rte_ring objects is made, which are located in shared hugepage memory.
122
123 The client_server_mp sample application shows this usage model.
124 It is described in the "Multi-process Sample Application" chapter in the *DPDK Sample Application's User Guide*.
125
126 Running Multiple Independent DPDK Applications
127 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
128
129 In addition to the above scenarios involving multiple DPDK processes working together,
130 it is possible to run multiple DPDK processes side-by-side,
131 where those processes are all working independently.
132 Support for this usage scenario is provided using the ``--file-prefix`` parameter to the EAL.
133
134 By default, the EAL creates hugepage files on each hugetlbfs filesystem using the rtemap_X filename,
135 where X is in the range 0 to the maximum number of hugepages -1.
136 Similarly, it creates shared configuration files, memory mapped in each process, using the /var/run/.rte_config filename,
137 when run as root (or $HOME/.rte_config when run as a non-root user;
138 if filesystem and device permissions are set up to allow this).
139 The rte part of the filenames of each of the above is configurable using the file-prefix parameter.
140
141 In addition to specifying the file-prefix parameter,
142 any DPDK applications that are to be run side-by-side must explicitly limit their memory use.
143 This is done by passing the -m flag to each process to specify how much hugepage memory, in megabytes,
144 each process can use (or passing ``--socket-mem`` to specify how much hugepage memory on each socket each process can use).
145
146 .. note::
147
148     Independent DPDK instances running side-by-side on a single machine cannot share any network ports.
149     Any network ports being used by one process should be blacklisted in every other process.
150
151 Running Multiple Independent Groups of DPDK Applications
152 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
153
154 In the same way that it is possible to run independent DPDK applications side- by-side on a single system,
155 this can be trivially extended to multi-process groups of DPDK applications running side-by-side.
156 In this case, the secondary processes must use the same ``--file-prefix`` parameter
157 as the primary process whose shared memory they are connecting to.
158
159 .. note::
160
161     All restrictions and issues with multiple independent DPDK processes running side-by-side
162     apply in this usage scenario also.
163
164 Multi-process Limitations
165 -------------------------
166
167 There are a number of limitations to what can be done when running DPDK multi-process applications.
168 Some of these are documented below:
169
170 *   The multi-process feature requires that the exact same hugepage memory mappings be present in all applications.
171     The Linux security feature - Address-Space Layout Randomization (ASLR) can interfere with this mapping,
172     so it may be necessary to disable this feature in order to reliably run multi-process applications.
173
174 .. warning::
175
176     Disabling Address-Space Layout Randomization (ASLR) may have security implications,
177     so it is recommended that it be disabled only when absolutely necessary,
178     and only when the implications of this change have been understood.
179
180 *   All DPDK processes running as a single application and using shared memory must have distinct coremask/corelist arguments.
181     It is not possible to have a primary and secondary instance, or two secondary instances,
182     using any of the same logical cores.
183     Attempting to do so can cause corruption of memory pool caches, among other issues.
184
185 *   The delivery of interrupts, such as Ethernet* device link status interrupts, do not work in secondary processes.
186     All interrupts are triggered inside the primary process only.
187     Any application needing interrupt notification in multiple processes should provide its own mechanism
188     to transfer the interrupt information from the primary process to any secondary process that needs the information.
189
190 *   The use of function pointers between multiple processes running based of different compiled binaries is not supported,
191     since the location of a given function in one process may be different to its location in a second.
192     This prevents the librte_hash library from behaving properly as in a multi-threaded instance,
193     since it uses a pointer to the hash function internally.
194
195 To work around this issue, it is recommended that multi-process applications perform the hash calculations by directly calling
196 the hashing function from the code and then using the rte_hash_add_with_hash()/rte_hash_lookup_with_hash() functions
197 instead of the functions which do the hashing internally, such as rte_hash_add()/rte_hash_lookup().
198
199 *   Depending upon the hardware in use, and the number of DPDK processes used,
200     it may not be possible to have HPET timers available in each DPDK instance.
201     The minimum number of HPET comparators available to Linux* userspace can be just a single comparator,
202     which means that only the first, primary DPDK process instance can open and mmap  /dev/hpet.
203     If the number of required DPDK processes exceeds that of the number of available HPET comparators,
204     the TSC (which is the default timer in this release) must be used as a time source across all processes instead of the HPET.