Implements the Google's Maglev hashing algorithm as a IPVS scheduler.
Basically it provides consistent hashing but offers some special
features about disruption and load balancing.
1) minimal disruption: when the set of destinations changes,
a connection will likely be sent to the same destination
as it was before.
2) load balancing: each destination will receive an almost
equal number of connections.
Seel also: [3.4 Consistent Hasing] in
https://static.googleusercontent.com/media/research.google.com/ko//pubs/archive/44824.pdf
v2: Add and refactor some features about MH and attach distribution test
results based on the MH's realtive weights.
I ran test program that pushes bunch of IP[:PORT] values via MH's
realtive weights algorithm.
The test program overview is:
- Send 1000 packet requests in test program per different weights test
case.
- Use same ip address and different ports per packet requests.
- IP_VS_MH_TAB_SIZE(prime number, M) is 4093.
- Use the highest 6 bits when the weight is very huge.
- It depends on IP_VS_MH_TAB_BITS.
The results are below.
1. All same weights.
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.105.181.70:80 mh (flag-1,flag-2)
-> 10.105.181.70:32906 Masq 1 0 236
-> 10.105.181.70:32907 Masq 1 0 231
-> 10.105.181.70:32908 Masq 1 0 254
-> 10.105.181.70:32909 Masq 1 0 239
2. Relative weigths.
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.105.181.70:80 mh (flag-1,flag-2)
-> 10.105.181.70:32914 Masq 1 0 88
-> 10.105.181.70:32915 Masq 2 0 212
-> 10.105.181.70:32916 Masq 3 0 296
-> 10.105.181.70:32917 Masq 4 0 364
3. Realtive weights with zero weight.
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.105.181.70:80 mh (flag-1,flag-2)
-> 10.105.181.70:32947 Masq 1 0 92
-> 10.105.181.70:32948 Masq 2 0 187
-> 10.105.181.70:32949 Masq 3 0 280
-> 10.105.181.70:32950 Masq 4 0 401
-> 10.105.181.70:32951 Masq 0 0 0
3-1. Turn a destination with zero weight to 5.
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.105.181.70:80 mh (flag-1,flag-2)
-> 10.105.181.70:32947 Masq 1 0 57
-> 10.105.181.70:32948 Masq 2 0 121
-> 10.105.181.70:32949 Masq 3 0 200
-> 10.105.181.70:32950 Masq 4 0 245
-> 10.105.181.70:32951 Masq 5 0 337
4. Divided all weights with gcd.
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.105.181.70:80 mh (flag-1,flag-2)
-> 10.105.181.70:32926 Masq 10 0 27
-> 10.105.181.70:32927 Masq 20 0 55
-> 10.105.181.70:32928 Masq 30 0 61
-> 10.105.181.70:32929 Masq 40 0 106
-> 10.105.181.70:32930 Masq 50 0 145
-> 10.105.181.70:32931 Masq 60 0 162
-> 10.105.181.70:32932 Masq 70 0 194
-> 10.105.181.70:32933 Masq 80 0 210
5. Can not divided weights with gcd.
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.105.181.70:80 mh (flag-1,flag-2)
-> 10.105.181.70:32934 Masq 15 0 128
-> 10.105.181.70:32935 Masq 31 0 284
-> 10.105.181.70:32936 Masq 63 0 548
6. Huge weights(each weight > M=4093).
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.105.181.70:80 mh (flag-1,flag-2)
-> 10.105.181.70:32937 Masq 5000 0 326
-> 10.105.181.70:32938 Masq 5000 0 331
-> 10.105.181.70:32939 Masq 5000 0 303
7. Gcd is not working with one huge weight.
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.105.181.70:80 mh (flag-1,flag-2)
-> 10.105.181.70:32940 Masq 64 0 31
-> 10.105.181.70:32941 Masq 127 0 55
-> 10.105.181.70:32942 Masq 2000 0 874
8. Gcd is not working and all weights are bigger then M(=4093).
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.105.181.70:80 mh (flag-1,flag-2)
-> 10.105.181.70:32943 Masq 4127 0 128
-> 10.105.181.70:32945 Masq 8191 0 269
-> 10.105.181.70:32946 Masq 16381 0 563
Inju Song (3):
netfilter: ipvs: Add some configuration of Maglev hashing.
netfilter: ipvs: Keep latest weight of destination.
netfilter: ipvs: Refactor Maglev hashing scheduler
include/net/ip_vs.h | 1 +
net/netfilter/ipvs/Kconfig | 37 ++++++
net/netfilter/ipvs/Makefile | 1 +
net/netfilter/ipvs/ip_vs_ctl.c | 4 +
net/netfilter/ipvs/ip_vs_mh.c | 291 +++++++++++++++++++++++++----------------
5 files changed, 221 insertions(+), 113 deletions(-)
--
1.8.3.1
--
Inju Song
NAVER Corporation
--
To unsubscribe from this list: send the line "unsubscribe lvs-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
|