Commit 4d0c875d authored by Julian Anastasov's avatar Julian Anastasov Committed by Simon Horman

ipvs: add sync_persist_mode flag

Add sync_persist_mode flag to reduce sync traffic
by syncing only persistent templates.
Signed-off-by: default avatarJulian Anastasov <ja@ssi.bg>
Tested-by: default avatarAleksey Chudov <aleksey.chudov@gmail.com>
Signed-off-by: default avatarSimon Horman <horms@verge.net.au>
parent eba3b5a7
...@@ -181,6 +181,19 @@ snat_reroute - BOOLEAN ...@@ -181,6 +181,19 @@ snat_reroute - BOOLEAN
always be the same as the original route so it is an optimisation always be the same as the original route so it is an optimisation
to disable snat_reroute and avoid the recalculation. to disable snat_reroute and avoid the recalculation.
sync_persist_mode - INTEGER
default 0
Controls the synchronisation of connections when using persistence
0: All types of connections are synchronised
1: Attempt to reduce the synchronisation traffic depending on
the connection type. For persistent services avoid synchronisation
for normal connections, do it only for persistence templates.
In such case, for TCP and SCTP it may need enabling sloppy_tcp and
sloppy_sctp flags on backup servers. For non-persistent services
such optimization is not applied, mode 0 is assumed.
sync_version - INTEGER sync_version - INTEGER
default 1 default 1
......
...@@ -975,6 +975,7 @@ struct netns_ipvs { ...@@ -975,6 +975,7 @@ struct netns_ipvs {
int sysctl_snat_reroute; int sysctl_snat_reroute;
int sysctl_sync_ver; int sysctl_sync_ver;
int sysctl_sync_ports; int sysctl_sync_ports;
int sysctl_sync_persist_mode;
unsigned long sysctl_sync_qlen_max; unsigned long sysctl_sync_qlen_max;
int sysctl_sync_sock_size; int sysctl_sync_sock_size;
int sysctl_cache_bypass; int sysctl_cache_bypass;
...@@ -1076,6 +1077,11 @@ static inline int sysctl_sync_ports(struct netns_ipvs *ipvs) ...@@ -1076,6 +1077,11 @@ static inline int sysctl_sync_ports(struct netns_ipvs *ipvs)
return ACCESS_ONCE(ipvs->sysctl_sync_ports); return ACCESS_ONCE(ipvs->sysctl_sync_ports);
} }
static inline int sysctl_sync_persist_mode(struct netns_ipvs *ipvs)
{
return ipvs->sysctl_sync_persist_mode;
}
static inline unsigned long sysctl_sync_qlen_max(struct netns_ipvs *ipvs) static inline unsigned long sysctl_sync_qlen_max(struct netns_ipvs *ipvs)
{ {
return ipvs->sysctl_sync_qlen_max; return ipvs->sysctl_sync_qlen_max;
...@@ -1139,6 +1145,11 @@ static inline int sysctl_sync_ports(struct netns_ipvs *ipvs) ...@@ -1139,6 +1145,11 @@ static inline int sysctl_sync_ports(struct netns_ipvs *ipvs)
return 1; return 1;
} }
static inline int sysctl_sync_persist_mode(struct netns_ipvs *ipvs)
{
return 0;
}
static inline unsigned long sysctl_sync_qlen_max(struct netns_ipvs *ipvs) static inline unsigned long sysctl_sync_qlen_max(struct netns_ipvs *ipvs)
{ {
return IPVS_SYNC_QLEN_MAX; return IPVS_SYNC_QLEN_MAX;
......
...@@ -1714,6 +1714,12 @@ static struct ctl_table vs_vars[] = { ...@@ -1714,6 +1714,12 @@ static struct ctl_table vs_vars[] = {
.mode = 0644, .mode = 0644,
.proc_handler = &proc_do_sync_ports, .proc_handler = &proc_do_sync_ports,
}, },
{
.procname = "sync_persist_mode",
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = proc_dointvec,
},
{ {
.procname = "sync_qlen_max", .procname = "sync_qlen_max",
.maxlen = sizeof(unsigned long), .maxlen = sizeof(unsigned long),
...@@ -3729,6 +3735,7 @@ static int __net_init ip_vs_control_net_init_sysctl(struct net *net) ...@@ -3729,6 +3735,7 @@ static int __net_init ip_vs_control_net_init_sysctl(struct net *net)
tbl[idx++].data = &ipvs->sysctl_sync_ver; tbl[idx++].data = &ipvs->sysctl_sync_ver;
ipvs->sysctl_sync_ports = 1; ipvs->sysctl_sync_ports = 1;
tbl[idx++].data = &ipvs->sysctl_sync_ports; tbl[idx++].data = &ipvs->sysctl_sync_ports;
tbl[idx++].data = &ipvs->sysctl_sync_persist_mode;
ipvs->sysctl_sync_qlen_max = nr_free_buffer_pages() / 32; ipvs->sysctl_sync_qlen_max = nr_free_buffer_pages() / 32;
tbl[idx++].data = &ipvs->sysctl_sync_qlen_max; tbl[idx++].data = &ipvs->sysctl_sync_qlen_max;
ipvs->sysctl_sync_sock_size = 0; ipvs->sysctl_sync_sock_size = 0;
......
...@@ -425,6 +425,16 @@ ip_vs_sync_buff_create_v0(struct netns_ipvs *ipvs) ...@@ -425,6 +425,16 @@ ip_vs_sync_buff_create_v0(struct netns_ipvs *ipvs)
return sb; return sb;
} }
/* Check if connection is controlled by persistence */
static inline bool in_persistence(struct ip_vs_conn *cp)
{
for (cp = cp->control; cp; cp = cp->control) {
if (cp->flags & IP_VS_CONN_F_TEMPLATE)
return true;
}
return false;
}
/* Check if conn should be synced. /* Check if conn should be synced.
* pkts: conn packets, use sysctl_sync_threshold to avoid packet check * pkts: conn packets, use sysctl_sync_threshold to avoid packet check
* - (1) sync_refresh_period: reduce sync rate. Additionally, retry * - (1) sync_refresh_period: reduce sync rate. Additionally, retry
...@@ -447,6 +457,8 @@ static int ip_vs_sync_conn_needed(struct netns_ipvs *ipvs, ...@@ -447,6 +457,8 @@ static int ip_vs_sync_conn_needed(struct netns_ipvs *ipvs,
/* Check if we sync in current state */ /* Check if we sync in current state */
if (unlikely(cp->flags & IP_VS_CONN_F_TEMPLATE)) if (unlikely(cp->flags & IP_VS_CONN_F_TEMPLATE))
force = 0; force = 0;
else if (unlikely(sysctl_sync_persist_mode(ipvs) && in_persistence(cp)))
return 0;
else if (likely(cp->protocol == IPPROTO_TCP)) { else if (likely(cp->protocol == IPPROTO_TCP)) {
if (!((1 << cp->state) & if (!((1 << cp->state) &
((1 << IP_VS_TCP_S_ESTABLISHED) | ((1 << IP_VS_TCP_S_ESTABLISHED) |
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment