LVS
lvs-devel
Google
 
Web LinuxVirtualServer.org

Re: ovf scheduler

To: Raducu Deaconu <rhadoo.io88@xxxxxxxxx>
Subject: Re: ovf scheduler
Cc: lvs-devel@xxxxxxxxxxxxxxx, Simon Horman <horms@xxxxxxxxxxxx>
From: Julian Anastasov <ja@xxxxxx>
Date: Fri, 17 Jul 2015 09:16:40 +0300 (EEST)
        Hello,

On Fri, 17 Jul 2015, Raducu Deaconu wrote:

> Hello,
> 
> I have done the corrections.
> 
> 
> Subject: [PATCH] Add ovf scheduler
> 
> Signed-off-by: Raducu Deaconu <rhadoo.io88@xxxxxxxxx>

        Thanks!

Acked-by: Julian Anastasov <ja@xxxxxx>

        Simon, please apply the attached patch to -next
tree after adding the "ipvs: " prefix.

> ---
>  net/netfilter/ipvs/Kconfig     |   11 +++++
>  net/netfilter/ipvs/Makefile    |    1 +
>  net/netfilter/ipvs/ip_vs_ovf.c |   86
> ++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 98 insertions(+)
>  create mode 100644 net/netfilter/ipvs/ip_vs_ovf.c
> 
> diff --git a/net/netfilter/ipvs/Kconfig b/net/netfilter/ipvs/Kconfig
> index 3b6929d..b32fb0d 100644
> --- a/net/netfilter/ipvs/Kconfig
> +++ b/net/netfilter/ipvs/Kconfig
> @@ -162,6 +162,17 @@ config  IP_VS_FO
>           If you want to compile it in kernel, say Y. To compile it as
> a
>           module, choose M here. If unsure, say N.
> 
> +config  IP_VS_OVF
> +       tristate "weighted overflow scheduling"
> +       ---help---
> +         The weighted overflow scheduling algorithm directs network
> +         connections to the server with the highest weight that is
> +         currently available and overflows to the next when active
> +         connections exceed the node's weight.
> +
> +         If you want to compile it in kernel, say Y. To compile it as a
> +         module, choose M here. If unsure, say N.
> +
>  config IP_VS_LBLC
>         tristate "locality-based least-connection scheduling"
>         ---help---
> diff --git a/net/netfilter/ipvs/Makefile b/net/netfilter/ipvs/Makefile
> index 38b2723..67f3f43 100644
> --- a/net/netfilter/ipvs/Makefile
> +++ b/net/netfilter/ipvs/Makefile
> @@ -27,6 +27,7 @@ obj-$(CONFIG_IP_VS_WRR) += ip_vs_wrr.o
>  obj-$(CONFIG_IP_VS_LC) += ip_vs_lc.o
>  obj-$(CONFIG_IP_VS_WLC) += ip_vs_wlc.o
>  obj-$(CONFIG_IP_VS_FO) += ip_vs_fo.o
> +obj-$(CONFIG_IP_VS_OVF) += ip_vs_ovf.o
>  obj-$(CONFIG_IP_VS_LBLC) += ip_vs_lblc.o
>  obj-$(CONFIG_IP_VS_LBLCR) += ip_vs_lblcr.o
>  obj-$(CONFIG_IP_VS_DH) += ip_vs_dh.o
> diff --git a/net/netfilter/ipvs/ip_vs_ovf.c b/net/netfilter/ipvs/ip_vs_ovf.c
> new file mode 100644
> index 0000000..f7d62c3
> --- /dev/null
> +++ b/net/netfilter/ipvs/ip_vs_ovf.c
> @@ -0,0 +1,86 @@
> +/*
> + * IPVS:        Overflow-Connection Scheduling module
> + *
> + * Authors:     Raducu Deaconu <rhadoo_io@xxxxxxxxx>
> + *
> + *              This program is free software; you can redistribute it and/or
> + *              modify it under the terms of the GNU General Public License
> + *              as published by the Free Software Foundation; either version
> + *              2 of the License, or (at your option) any later version.
> + *
> + * Scheduler implements "overflow" loadbalancing according to number of 
> active
> + * connections , will keep all conections to the node with the highest weight
> + * and overflow to the next node if the number of connections exceeds
> the node's
> + * weight.
> + * Note that this scheduler might not be suitable for UDP because it only 
> uses
> + * active connections
> + *
> + */
> +
> +#define KMSG_COMPONENT "IPVS"
> +#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
> +
> +#include <linux/module.h>
> +#include <linux/kernel.h>
> +
> +#include <net/ip_vs.h>
> +
> +/* OVF Connection scheduling  */
> +static struct ip_vs_dest *
> +ip_vs_ovf_schedule(struct ip_vs_service *svc, const struct sk_buff *skb,
> +                  struct ip_vs_iphdr *iph)
> +{
> +       struct ip_vs_dest *dest, *h = NULL;
> +       int hw = 0, w;
> +
> +       IP_VS_DBG(6, "ip_vs_ovf_schedule(): Scheduling...\n");
> +       /* select the node with highest weight, go to next in line if active
> +       * connections exceed weight
> +       */
> +       list_for_each_entry_rcu(dest, &svc->destinations, n_list) {
> +               w = atomic_read(&dest->weight);
> +               if ((dest->flags & IP_VS_DEST_F_OVERLOAD) ||
> +                   atomic_read(&dest->activeconns) > w ||
> +                   w == 0)
> +                       continue;
> +               if (!h || w > hw) {
> +                       h = dest;
> +                       hw = w;
> +               }
> +       }
> +
> +       if (h) {
> +               IP_VS_DBG_BUF(6, "OVF: server %s:%u active %d w %d\n",
> +                             IP_VS_DBG_ADDR(h->af, &h->addr),
> +                             ntohs(h->port),
> +                             atomic_read(&h->activeconns),
> +                             atomic_read(&h->weight));
> +               return h;
> +       }
> +
> +       ip_vs_scheduler_err(svc, "no destination available");
> +       return NULL;
> +}
> +
> +static struct ip_vs_scheduler ip_vs_ovf_scheduler = {
> +       .name =                 "ovf",
> +       .refcnt =               ATOMIC_INIT(0),
> +       .module =               THIS_MODULE,
> +       .n_list =               LIST_HEAD_INIT(ip_vs_ovf_scheduler.n_list),
> +       .schedule =             ip_vs_ovf_schedule,
> +};
> +
> +static int __init ip_vs_ovf_init(void)
> +{
> +       return register_ip_vs_scheduler(&ip_vs_ovf_scheduler);
> +}
> +
> +static void __exit ip_vs_ovf_cleanup(void)
> +{
> +       unregister_ip_vs_scheduler(&ip_vs_ovf_scheduler);
> +       synchronize_rcu();
> +}
> +
> +module_init(ip_vs_ovf_init);
> +module_exit(ip_vs_ovf_cleanup);
> +MODULE_LICENSE("GPL");
> -- 
> 1.7.10.4

Regards

--
Julian Anastasov <ja@xxxxxx>
--
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

<Prev in Thread] Current Thread [Next in Thread>