Add L3DSR feature in LB plugin
[vpp.git] / src / plugins / lb / lb_plugin_doc.md
1 # Load Balancer plugin for VPP    {#lb_plugin_doc}
2
3 ## Version
4
5 The load balancer plugin is currently in *beta* version.
6 Both CLIs and APIs are subject to *heavy* changes.
7 Wich also means feedback is really welcome regarding features, apis, etc...
8
9 ## Overview
10
11 This plugin provides load balancing for VPP in a way that is largely inspired
12 from Google's MagLev: http://research.google.com/pubs/pub44824.html
13
14 The load balancer is configured with a set of Virtual IPs (VIP, which can be
15 prefixes), and for each VIP, with a set of Application Server addresses (ASs).
16
17 There are four encap types to steer traffic to different ASs:
18 1). IPv4+GRE ad IPv6+GRE encap types:
19 Traffic received for a given VIP (or VIP prefix) is tunneled using GRE towards
20 the different ASs in a way that (tries to) ensure that a given session will
21 always be tunneled to the same AS.
22
23 2). IPv4+L3DSR encap types:
24 L3DSR is used to overcome Layer 2 limitations of Direct Server Return Load Balancing.
25 It maps VIP to DSCP bits, and reuse TOS bits to transfer DSCP bits
26 to server, and then server will get VIP from DSCP-to-VIP mapping.
27
28 Both VIPs or ASs can be IPv4 or IPv6, but for a given VIP, all ASs must be using
29 the same encap. type (i.e. IPv4+GRE or IPv6+GRE or IPv4+L3DSR).
30 Meaning that for a given VIP, all AS addresses must be of the same family.
31
32 ## Performances
33
34 The load balancer has been tested up to 1 millions flows and still forwards more
35 than 3Mpps per core in such circumstances.
36 Although 3Mpps seems already good, it is likely that performances will be improved
37 in next versions.
38
39 ## Configuration
40
41 ### Global LB parameters
42
43 The load balancer needs to be configured with some parameters:
44
45         lb conf [ip4-src-address <addr>] [ip6-src-address <addr>]
46                 [buckets <n>] [timeout <s>]
47
48 ip4-src-address: the source address used to send encap. packets using IPv4.
49
50 ip6-src-address: the source address used to send encap. packets using IPv6.
51
52 buckets:         the *per-thread* established-connexions-table number of buckets.
53
54 timeout:         the number of seconds a connection will remain in the
55                  established-connexions-table while no packet for this flow
56                  is received.
57
58 ### Configure the VIPs
59
60     lb vip <prefix> [encap (gre6|gre4|l3dsr)] [dscp <n>] [new_len <n>] [del]
61
62 new_len is the size of the new-connection-table. It should be 1 or 2 orders of
63 magnitude bigger than the number of ASs for the VIP in order to ensure a good
64 load balancing.
65 Encap l3dsr and dscp is used to map VIP to dscp bit and rewrite DSCP bit in packets.
66 So the selected server could get VIP from DSCP bit in this packet and perform DSR.
67
68 Examples:
69
70     lb vip 2002::/16 encap gre6 new_len 1024
71     lb vip 2003::/16 encap gre4 new_len 2048
72     lb vip 80.0.0.0/8 encap gre6 new_len 16
73     lb vip 90.0.0.0/8 encap gre4 new_len 1024
74     lb vip 100.0.0.0/8 encap l3dsr dscp 2 new_len 32
75
76 ### Configure the ASs (for each VIP)
77
78     lb as <vip-prefix> [<address> [<address> [...]]] [del]
79
80 You can add (or delete) as many ASs at a time (for a single VIP).
81 Note that the AS address family must correspond to the VIP encap. IP family.
82
83 Examples:
84
85     lb as 2002::/16 2001::2 2001::3 2001::4
86     lb as 2003::/16 10.0.0.1 10.0.0.2
87     lb as 80.0.0.0/8 2001::2
88     lb as 90.0.0.0/8 10.0.0.1
89     
90     
91
92 ## Monitoring
93
94 The plugin provides quite a bunch of counters and information.
95 These are still subject to quite significant changes.
96
97     show lb
98     show lb vip
99     show lb vip verbose
100     
101     show node counters
102
103
104 ## Design notes
105
106 ### Multi-Threading
107
108 MagLev is a distributed system which pseudo-randomly generates a 
109 new-connections-table based on AS names such that each server configured with 
110 the same set of ASs ends up with the same table. Connection stickyness is then 
111 ensured with an established-connections-table. Using ECMP, it is assumed (but
112 not relied on) that servers will mostly receive traffic for different flows.
113
114 This implementation pushes the parallelism a little bit further by using
115 one established-connections table per thread. This is equivalent to assuming
116 that RSS will make a job similar to ECMP, and is pretty useful as threads don't
117 need to get a lock in order to write in the table.
118
119 ### Hash Table
120
121 A load balancer requires an efficient read and write hash table. The hash table
122 used by ip6-forward is very read-efficient, but not so much for writing. In
123 addition, it is not a big deal if writing into the hash table fails (again,
124 MagLev uses a flow table but does not heaviliy relies on it).
125
126 The plugin therefore uses a very specific (and stupid) hash table.
127         - Fixed (and power of 2) number of buckets (configured at runtime)
128         - Fixed (and power of 2) elements per buckets (configured at compilation time)
129
130 ### Reference counting
131
132 When an AS is removed, there is two possible ways to react.
133         - Keep using the AS for established connections
134         - Change AS for established connections (likely to cause error for TCP)
135
136 In the first case, although an AS is removed from the configuration, its 
137 associated state needs to stay around as long as it is used by at least one 
138 thread.
139
140 In order to avoid locks, a specific reference counter is used. The design is quite
141 similar to clib counters but:
142         - It is possible to decrease the value
143         - Summing will not zero the per-thread counters
144         - Only the thread can reallocate its own counters vector (to avoid concurrency issues)
145
146 This reference counter is lock free, but reading a count of 0 does not mean
147 the value can be freed unless it is ensured by *other* means that no other thread
148 is concurrently referencing the object. In the case of this plugin, it is assumed
149 that no concurrent event will take place after a few seconds.
150