aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Maxim <mike@okcupid.com>2011-12-08 10:55:09 -0500
committerPablo Neira Ayuso <pablo@netfilter.org>2011-12-13 05:34:48 -0500
commit76ad94fc5df865e34e09406614f29951a046394a (patch)
tree3bb7ebe3425c65293ff9e4ad5eb2d059a13f6421
parente26f9a480fb6c1b614660e824d69a74e2ce990f3 (diff)
IPVS: Modify the SH scheduler to use weights
Modify the algorithm to build the source hashing hash table to add extra slots for destinations with higher weight. This has the effect of allowing an IPVS SH user to give more connections to hosts that have been configured to have a higher weight. The reason for the Kconfig change is because the size of the hash table becomes more relevant/important if you decide to use the weights in the manner this patch lets you. It would be conceivable that someone might need to increase the size of that table to accommodate their configuration, so it will be handy to be able to do that through the regular configuration system instead of editing the source. Signed-off-by: Michael Maxim <mike@okcupid.com> Signed-off-by: Simon Horman <horms@verge.net.au> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--net/netfilter/ipvs/Kconfig15
-rw-r--r--net/netfilter/ipvs/ip_vs_sh.c18
2 files changed, 32 insertions, 1 deletions
diff --git a/net/netfilter/ipvs/Kconfig b/net/netfilter/ipvs/Kconfig
index 70bd1d0774c6..af4c0b8c5275 100644
--- a/net/netfilter/ipvs/Kconfig
+++ b/net/netfilter/ipvs/Kconfig
@@ -232,6 +232,21 @@ config IP_VS_NQ
232 If you want to compile it in kernel, say Y. To compile it as a 232 If you want to compile it in kernel, say Y. To compile it as a
233 module, choose M here. If unsure, say N. 233 module, choose M here. If unsure, say N.
234 234
235comment 'IPVS SH scheduler'
236
237config IP_VS_SH_TAB_BITS
238 int "IPVS source hashing table size (the Nth power of 2)"
239 range 4 20
240 default 8
241 ---help---
242 The source hashing scheduler maps source IPs to destinations
243 stored in a hash table. This table is tiled by each destination
244 until all slots in the table are filled. When using weights to
245 allow destinations to receive more connections, the table is
246 tiled an amount proportional to the weights specified. The table
247 needs to be large enough to effectively fit all the destinations
248 multiplied by their respective weights.
249
235comment 'IPVS application helper' 250comment 'IPVS application helper'
236 251
237config IP_VS_FTP 252config IP_VS_FTP
diff --git a/net/netfilter/ipvs/ip_vs_sh.c b/net/netfilter/ipvs/ip_vs_sh.c
index 33815f4fb451..069e8d4d5c01 100644
--- a/net/netfilter/ipvs/ip_vs_sh.c
+++ b/net/netfilter/ipvs/ip_vs_sh.c
@@ -30,6 +30,11 @@
30 * server is dead or overloaded, the load balancer can bypass the cache 30 * server is dead or overloaded, the load balancer can bypass the cache
31 * server and send requests to the original server directly. 31 * server and send requests to the original server directly.
32 * 32 *
33 * The weight destination attribute can be used to control the
34 * distribution of connections to the destinations in servernode. The
35 * greater the weight, the more connections the destination
36 * will receive.
37 *
33 */ 38 */
34 39
35#define KMSG_COMPONENT "IPVS" 40#define KMSG_COMPONENT "IPVS"
@@ -99,9 +104,11 @@ ip_vs_sh_assign(struct ip_vs_sh_bucket *tbl, struct ip_vs_service *svc)
99 struct ip_vs_sh_bucket *b; 104 struct ip_vs_sh_bucket *b;
100 struct list_head *p; 105 struct list_head *p;
101 struct ip_vs_dest *dest; 106 struct ip_vs_dest *dest;
107 int d_count;
102 108
103 b = tbl; 109 b = tbl;
104 p = &svc->destinations; 110 p = &svc->destinations;
111 d_count = 0;
105 for (i=0; i<IP_VS_SH_TAB_SIZE; i++) { 112 for (i=0; i<IP_VS_SH_TAB_SIZE; i++) {
106 if (list_empty(p)) { 113 if (list_empty(p)) {
107 b->dest = NULL; 114 b->dest = NULL;
@@ -113,7 +120,16 @@ ip_vs_sh_assign(struct ip_vs_sh_bucket *tbl, struct ip_vs_service *svc)
113 atomic_inc(&dest->refcnt); 120 atomic_inc(&dest->refcnt);
114 b->dest = dest; 121 b->dest = dest;
115 122
116 p = p->next; 123 IP_VS_DBG_BUF(6, "assigned i: %d dest: %s weight: %d\n",
124 i, IP_VS_DBG_ADDR(svc->af, &dest->addr),
125 atomic_read(&dest->weight));
126
127 /* Don't move to next dest until filling weight */
128 if (++d_count >= atomic_read(&dest->weight)) {
129 p = p->next;
130 d_count = 0;
131 }
132
117 } 133 }
118 b++; 134 b++;
119 } 135 }