LVS
lvs-devel
Google
 
Web LinuxVirtualServer.org

Re: [net-next 1/2] ipvs: batch __ip_vs_cleanup

To: Julian Anastasov <ja@xxxxxx>
Subject: Re: [net-next 1/2] ipvs: batch __ip_vs_cleanup
Cc: "David S. Miller" <davem@xxxxxxxxxxxxx>, Pablo Neira Ayuso <pablo@xxxxxxxxxxxxx>, Simon Horman <horms@xxxxxxxxxxxx>, netdev@xxxxxxxxxxxxxxx, lvs-devel@xxxxxxxxxxxxxxx, linux-kernel@xxxxxxxxxxxxxxx, netfilter-devel@xxxxxxxxxxxxxxx
From: Haishuang Yan <yanhaishuang@xxxxxxxxxxxxxxxxxxxx>
Date: Thu, 18 Jul 2019 22:16:05 +0800
> On 2019年7月16日, at 上午4:39, Julian Anastasov <ja@xxxxxx> wrote:
> 
> 
>       Hello,
> 
> On Sat, 13 Jul 2019, Haishuang Yan wrote:
> 
>> It's better to batch __ip_vs_cleanup to speedup ipvs
>> connections dismantle.
>> 
>> Signed-off-by: Haishuang Yan <yanhaishuang@xxxxxxxxxxxxxxxxxxxx>
>> ---
>> include/net/ip_vs.h             |  2 +-
>> net/netfilter/ipvs/ip_vs_core.c | 29 +++++++++++++++++------------
>> net/netfilter/ipvs/ip_vs_ctl.c  | 13 ++++++++++---
>> 3 files changed, 28 insertions(+), 16 deletions(-)
>> 
>> diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h
>> index 3759167..93e7a25 100644
>> --- a/include/net/ip_vs.h
>> +++ b/include/net/ip_vs.h
>> @@ -1324,7 +1324,7 @@ static inline void ip_vs_control_del(struct ip_vs_conn 
>> *cp)
>> void ip_vs_control_net_cleanup(struct netns_ipvs *ipvs);
>> void ip_vs_estimator_net_cleanup(struct netns_ipvs *ipvs);
>> void ip_vs_sync_net_cleanup(struct netns_ipvs *ipvs);
>> -void ip_vs_service_net_cleanup(struct netns_ipvs *ipvs);
>> +void ip_vs_service_nets_cleanup(struct list_head *net_list);
>> 
>> /* IPVS application functions
>>  * (from ip_vs_app.c)
>> diff --git a/net/netfilter/ipvs/ip_vs_core.c 
>> b/net/netfilter/ipvs/ip_vs_core.c
>> index 46f06f9..b4d79b7 100644
>> --- a/net/netfilter/ipvs/ip_vs_core.c
>> +++ b/net/netfilter/ipvs/ip_vs_core.c
>> @@ -2402,18 +2402,23 @@ static int __net_init __ip_vs_init(struct net *net)
>>      return -ENOMEM;
>> }
>> 
>> -static void __net_exit __ip_vs_cleanup(struct net *net)
>> +static void __net_exit __ip_vs_cleanup_batch(struct list_head *net_list)
>> {
>> -    struct netns_ipvs *ipvs = net_ipvs(net);
>> -
>> -    ip_vs_service_net_cleanup(ipvs);        /* ip_vs_flush() with locks */
>> -    ip_vs_conn_net_cleanup(ipvs);
>> -    ip_vs_app_net_cleanup(ipvs);
>> -    ip_vs_protocol_net_cleanup(ipvs);
>> -    ip_vs_control_net_cleanup(ipvs);
>> -    ip_vs_estimator_net_cleanup(ipvs);
>> -    IP_VS_DBG(2, "ipvs netns %d released\n", ipvs->gen);
>> -    net->ipvs = NULL;
>> +    struct netns_ipvs *ipvs;
>> +    struct net *net;
>> +    LIST_HEAD(list);
>> +
>> +    ip_vs_service_nets_cleanup(net_list);   /* ip_vs_flush() with locks */
>> +    list_for_each_entry(net, net_list, exit_list) {
> 
>       How much faster is to replace list_for_each_entry in
> ops_exit_list() with this one. IPVS can waste time in calls
> such as kthread_stop() and del_timer_sync() but I'm not sure
> we can solve it easily. What gain do you see in benchmarks?

Hi, 

As the following benchmark testing results show, there is a little performance 
improvement:

$  cat add_del_unshare.sh
#!/bin/bash

for i in `seq 1 100`
    do
     (for j in `seq 1 40` ; do  unshare -n ipvsadm -A -t 172.16.$i.$j:80 
>/dev/null ; done) &
    done
wait; grep net_namespace /proc/slabinfo

Befor patch:
$  time sh add_del_unshare.sh
net_namespace       4020   4020   4736    6    8 : tunables    0    0    0 : 
slabdata    670    670      0

real    0m8.086s
user    0m2.025s
sys     0m36.956s

After patch:
$  time sh add_del_unshare.sh
net_namespace       4020   4020   4736    6    8 : tunables    0    0    0 : 
slabdata    670    670      0

real    0m7.623s
user    0m2.003s
sys     0m32.935s


> 
>> +            ipvs = net_ipvs(net);
>> +            ip_vs_conn_net_cleanup(ipvs);
>> +            ip_vs_app_net_cleanup(ipvs);
>> +            ip_vs_protocol_net_cleanup(ipvs);
>> +            ip_vs_control_net_cleanup(ipvs);
>> +            ip_vs_estimator_net_cleanup(ipvs);
>> +            IP_VS_DBG(2, "ipvs netns %d released\n", ipvs->gen);
>> +            net->ipvs = NULL;
>> +    }
>> }
> 
> Regards
> 
> --
> Julian Anastasov <ja@xxxxxx>
> 




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