aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2012-05-08 13:39:49 -0400
committerPablo Neira Ayuso <pablo@netfilter.org>2012-05-08 13:39:53 -0400
commit1c003b1580e20ff9f500846677303a695b1837cc (patch)
treed00c951b6e4c88edd403b4d8ead96a57b9bfc808 /include
parentcdcc5e905d59026fbf2e7f74f9cc834203b6207b (diff)
ipvs: wakeup master thread
High rate of sync messages in master can lead to overflowing the socket buffer and dropping the messages. Fixed sleep of 1 second without wakeup events is not suitable for loaded masters, Use delayed_work to schedule sending for queued messages and limit the delay to IPVS_SYNC_SEND_DELAY (20ms). This will reduce the rate of wakeups but to avoid sending long bursts we wakeup the master thread after IPVS_SYNC_WAKEUP_RATE (8) messages. Add hard limit for the queued messages before sending by using "sync_qlen_max" sysctl var. It defaults to 1/32 of the memory pages but actually represents number of messages. It will protect us from allocating large parts of memory when the sending rate is lower than the queuing rate. As suggested by Pablo, add new sysctl var "sync_sock_size" to configure the SNDBUF (master) or RCVBUF (slave) socket limit. Default value is 0 (preserve system defaults). Change the master thread to detect and block on SNDBUF overflow, so that we do not drop messages when the socket limit is low but the sync_qlen_max limit is not reached. On ENOBUFS or other errors just drop the messages. Change master thread to enter TASK_INTERRUPTIBLE state early, so that we do not miss wakeups due to messages or kthread_should_stop event. Thanks to Pablo Neira Ayuso for his valuable feedback! Signed-off-by: Julian Anastasov <ja@ssi.bg> Signed-off-by: Simon Horman <horms@verge.net.au>
Diffstat (limited to 'include')
-rw-r--r--include/net/ip_vs.h29
1 files changed, 29 insertions, 0 deletions
diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h
index 93b81aa73429..30e43c8c0283 100644
--- a/include/net/ip_vs.h
+++ b/include/net/ip_vs.h
@@ -869,6 +869,8 @@ struct netns_ipvs {
869#endif 869#endif
870 int sysctl_snat_reroute; 870 int sysctl_snat_reroute;
871 int sysctl_sync_ver; 871 int sysctl_sync_ver;
872 int sysctl_sync_qlen_max;
873 int sysctl_sync_sock_size;
872 int sysctl_cache_bypass; 874 int sysctl_cache_bypass;
873 int sysctl_expire_nodest_conn; 875 int sysctl_expire_nodest_conn;
874 int sysctl_expire_quiescent_template; 876 int sysctl_expire_quiescent_template;
@@ -889,6 +891,9 @@ struct netns_ipvs {
889 struct timer_list est_timer; /* Estimation timer */ 891 struct timer_list est_timer; /* Estimation timer */
890 /* ip_vs_sync */ 892 /* ip_vs_sync */
891 struct list_head sync_queue; 893 struct list_head sync_queue;
894 int sync_queue_len;
895 unsigned int sync_queue_delay;
896 struct delayed_work master_wakeup_work;
892 spinlock_t sync_lock; 897 spinlock_t sync_lock;
893 struct ip_vs_sync_buff *sync_buff; 898 struct ip_vs_sync_buff *sync_buff;
894 spinlock_t sync_buff_lock; 899 spinlock_t sync_buff_lock;
@@ -911,6 +916,10 @@ struct netns_ipvs {
911#define DEFAULT_SYNC_THRESHOLD 3 916#define DEFAULT_SYNC_THRESHOLD 3
912#define DEFAULT_SYNC_PERIOD 50 917#define DEFAULT_SYNC_PERIOD 50
913#define DEFAULT_SYNC_VER 1 918#define DEFAULT_SYNC_VER 1
919#define IPVS_SYNC_WAKEUP_RATE 8
920#define IPVS_SYNC_QLEN_MAX (IPVS_SYNC_WAKEUP_RATE * 4)
921#define IPVS_SYNC_SEND_DELAY (HZ / 50)
922#define IPVS_SYNC_CHECK_PERIOD HZ
914 923
915#ifdef CONFIG_SYSCTL 924#ifdef CONFIG_SYSCTL
916 925
@@ -929,6 +938,16 @@ static inline int sysctl_sync_ver(struct netns_ipvs *ipvs)
929 return ipvs->sysctl_sync_ver; 938 return ipvs->sysctl_sync_ver;
930} 939}
931 940
941static inline int sysctl_sync_qlen_max(struct netns_ipvs *ipvs)
942{
943 return ipvs->sysctl_sync_qlen_max;
944}
945
946static inline int sysctl_sync_sock_size(struct netns_ipvs *ipvs)
947{
948 return ipvs->sysctl_sync_sock_size;
949}
950
932#else 951#else
933 952
934static inline int sysctl_sync_threshold(struct netns_ipvs *ipvs) 953static inline int sysctl_sync_threshold(struct netns_ipvs *ipvs)
@@ -946,6 +965,16 @@ static inline int sysctl_sync_ver(struct netns_ipvs *ipvs)
946 return DEFAULT_SYNC_VER; 965 return DEFAULT_SYNC_VER;
947} 966}
948 967
968static inline int sysctl_sync_qlen_max(struct netns_ipvs *ipvs)
969{
970 return IPVS_SYNC_QLEN_MAX;
971}
972
973static inline int sysctl_sync_sock_size(struct netns_ipvs *ipvs)
974{
975 return 0;
976}
977
949#endif 978#endif
950 979
951/* 980/*