diff --git a/ChangeLog.d/bugfix/ZBX-7933 b/ChangeLog.d/bugfix/ZBX-7933 new file mode 100644 index 000000000000..51c55e30517f --- /dev/null +++ b/ChangeLog.d/bugfix/ZBX-7933 @@ -0,0 +1 @@ +...G...PS. [ZBX-7933] added configurable parameter for TCP queue maximum size (dgoloscapov) diff --git a/conf/zabbix_agentd.conf b/conf/zabbix_agentd.conf index 12afc725ed0c..d1b370a18ab7 100644 --- a/conf/zabbix_agentd.conf +++ b/conf/zabbix_agentd.conf @@ -511,3 +511,14 @@ Hostname=Zabbix server # Mandatory: no # Default: # TLSCipherAll= + +####### For advanced users - TCP-related fine-tuning parameters ####### + +## Option: ListenBacklog +# The maximum number of pending connections in the queue. This parameter is passed to +# listen() function as argument 'backlog' (see "man listen"). +# +# Mandatory: no +# Range: 0 - INT_MAX (depends on system, too large values may be silently truncated to implementation-specified maximum) +# Default: SOMAXCONN (hard-coded constant, depends on system) +# ListenBacklog= diff --git a/conf/zabbix_agentd.win.conf b/conf/zabbix_agentd.win.conf index 9b5a18539c65..9eeed1140c89 100644 --- a/conf/zabbix_agentd.win.conf +++ b/conf/zabbix_agentd.win.conf @@ -470,3 +470,14 @@ Hostname=Windows host # Mandatory: no # Default: # TLSCipherAll= + +####### For advanced users - TCP-related fine-tuning parameters ####### + +## Option: ListenBacklog +# The maximum number of pending connections in the queue. This parameter is passed to +# listen() function as argument 'backlog' (see "man listen"). +# +# Mandatory: no +# Range: 0 - INT_MAX (depends on system, too large values may be silently truncated to implementation-specified maximum) +# Default: SOMAXCONN (hard-coded constant, depends on system) +# ListenBacklog= diff --git a/conf/zabbix_proxy.conf b/conf/zabbix_proxy.conf index 8ba915f3d693..92c17bca2055 100644 --- a/conf/zabbix_proxy.conf +++ b/conf/zabbix_proxy.conf @@ -901,3 +901,13 @@ StatsAllowedIP=127.0.0.1 # Default: # VaultDBPath= +####### For advanced users - TCP-related fine-tuning parameters ####### + +## Option: ListenBacklog +# The maximum number of pending connections in the queue. This parameter is passed to +# listen() function as argument 'backlog' (see "man listen"). +# +# Mandatory: no +# Range: 0 - INT_MAX (depends on system, too large values may be silently truncated to implementation-specified maximum) +# Default: SOMAXCONN (hard-coded constant, depends on system) +# ListenBacklog= diff --git a/conf/zabbix_server.conf b/conf/zabbix_server.conf index 0f2ed8a1ff62..98d99af72885 100644 --- a/conf/zabbix_server.conf +++ b/conf/zabbix_server.conf @@ -933,3 +933,14 @@ StatsAllowedIP=127.0.0.1 # Range: 1-3600 # Default: # ProblemHousekeepingFrequency=60 + +####### For advanced users - TCP-related fine-tuning parameters ####### + +## Option: ListenBacklog +# The maximum number of pending connections in the queue. This parameter is passed to +# listen() function as argument 'backlog' (see "man listen"). +# +# Mandatory: no +# Range: 0 - INT_MAX (depends on system, too large values may be silently truncated to implementation-specified maximum) +# Default: SOMAXCONN (hard-coded constant, depends on system) +# ListenBacklog= diff --git a/src/go/pkg/zbxlib/globals_linux.go b/src/go/pkg/zbxlib/globals_linux.go index 9ad82919167f..d38ebb352d34 100644 --- a/src/go/pkg/zbxlib/globals_linux.go +++ b/src/go/pkg/zbxlib/globals_linux.go @@ -86,6 +86,7 @@ char *CONFIG_TLS_CIPHER_CMD = NULL; int CONFIG_PASSIVE_FORKS = 0; int CONFIG_ACTIVE_FORKS = 0; +int CONFIG_TCP_MAX_BACKLOG_SIZE = SOMAXCONN; const char *progname = NULL; const char title_message[] = "agent"; diff --git a/src/go/pkg/zbxlib/globals_windows.go b/src/go/pkg/zbxlib/globals_windows.go index 9d8631683243..5785f27b870c 100644 --- a/src/go/pkg/zbxlib/globals_windows.go +++ b/src/go/pkg/zbxlib/globals_windows.go @@ -59,6 +59,8 @@ int CONFIG_UNSAFE_USER_PARAMETERS= 0; int CONFIG_ENABLE_REMOTE_COMMANDS= 0; char *CONFIG_SOURCE_IP = NULL; +int CONFIG_TCP_MAX_BACKLOG_SIZE = SOMAXCONN; + const char *progname = NULL; const char title_message[] = "agent"; const char *usage_message[] = {}; diff --git a/src/libs/zbxcomms/comms.c b/src/libs/zbxcomms/comms.c index 763eac5ae3f4..0e6e2d7da820 100644 --- a/src/libs/zbxcomms/comms.c +++ b/src/libs/zbxcomms/comms.c @@ -48,6 +48,7 @@ extern ZBX_THREAD_LOCAL char info_buf[256]; #endif extern int CONFIG_TIMEOUT; +extern int CONFIG_TCP_MAX_BACKLOG_SIZE; /****************************************************************************** * * @@ -1146,7 +1147,7 @@ int zbx_tcp_listen(zbx_socket_t *s, const char *listen_ip, unsigned short listen goto out; } - if (ZBX_PROTO_ERROR == listen(s->sockets[s->num_socks], SOMAXCONN)) + if (ZBX_PROTO_ERROR == listen(s->sockets[s->num_socks], CONFIG_TCP_MAX_BACKLOG_SIZE)) { zbx_set_socket_strerror("listen() for [[%s]:%s] failed: %s", NULL != ip ? ip : "-", port, @@ -1319,7 +1320,7 @@ int zbx_tcp_listen(zbx_socket_t *s, const char *listen_ip, unsigned short listen goto out; } - if (ZBX_PROTO_ERROR == listen(s->sockets[s->num_socks], SOMAXCONN)) + if (ZBX_PROTO_ERROR == listen(s->sockets[s->num_socks], CONFIG_TCP_MAX_BACKLOG_SIZE)) { zbx_set_socket_strerror("listen() for [[%s]:%hu] failed: %s", NULL != ip ? ip : "-", listen_port, diff --git a/src/zabbix_agent/zabbix_agentd.c b/src/zabbix_agent/zabbix_agentd.c index c01bcf82032c..9d517a4162c4 100644 --- a/src/zabbix_agent/zabbix_agentd.c +++ b/src/zabbix_agent/zabbix_agentd.c @@ -93,6 +93,8 @@ char *CONFIG_TLS_CIPHER_ALL = NULL; char *CONFIG_TLS_CIPHER_CMD13 = NULL; /* not used in agent, defined for linking with tls.c */ char *CONFIG_TLS_CIPHER_CMD = NULL; /* not used in agent, defined for linking with tls.c */ +int CONFIG_TCP_MAX_BACKLOG_SIZE = SOMAXCONN; + #ifndef _WINDOWS # include "../libs/zbxnix/control.h" # include "zbxmodules.h" @@ -951,6 +953,8 @@ static void zbx_load_config(int requirement, ZBX_TASK_EX *task) PARM_OPT, 0, 0}, {"DenyKey", load_key_access_rule, TYPE_CUSTOM, PARM_OPT, 0, 0}, + {"ListenBacklog", &CONFIG_TCP_MAX_BACKLOG_SIZE, TYPE_INT, + PARM_OPT, 0, INT_MAX}, {NULL} }; diff --git a/src/zabbix_get/zabbix_get.c b/src/zabbix_get/zabbix_get.c index 833d6e7c3846..357e0b457ab6 100644 --- a/src/zabbix_get/zabbix_get.c +++ b/src/zabbix_get/zabbix_get.c @@ -184,6 +184,8 @@ char *CONFIG_TLS_CIPHER_CMD = NULL; /* parameter '--tls-cipher' from zabbix_get int CONFIG_PASSIVE_FORKS = 0; /* not used in zabbix_get, just for linking with tls.c */ int CONFIG_ACTIVE_FORKS = 0; /* not used in zabbix_get, just for linking with tls.c */ +int CONFIG_TCP_MAX_BACKLOG_SIZE = SOMAXCONN; + /* COMMAND LINE OPTIONS */ /* long options */ diff --git a/src/zabbix_proxy/proxy.c b/src/zabbix_proxy/proxy.c index 7e8a85425167..19113c9bba9e 100644 --- a/src/zabbix_proxy/proxy.c +++ b/src/zabbix_proxy/proxy.c @@ -309,6 +309,7 @@ char *CONFIG_HISTORY_STORAGE_OPTS = NULL; int CONFIG_HISTORY_STORAGE_PIPELINES = 0; char *CONFIG_STATS_ALLOWED_IP = NULL; +int CONFIG_TCP_MAX_BACKLOG_SIZE = SOMAXCONN; int CONFIG_DOUBLE_PRECISION = ZBX_DB_DBL_PRECISION_ENABLED; @@ -869,6 +870,8 @@ static void zbx_load_config(ZBX_TASK_EX *task) PARM_OPT, 1, 1000}, {"StartHistoryPollers", &CONFIG_HISTORYPOLLER_FORKS, TYPE_INT, PARM_OPT, 0, 1000}, + {"ListenBacklog", &CONFIG_TCP_MAX_BACKLOG_SIZE, TYPE_INT, + PARM_OPT, 0, INT_MAX}, {NULL} }; diff --git a/src/zabbix_sender/win32/zabbix_sender.c b/src/zabbix_sender/win32/zabbix_sender.c index 5ba28c390ea6..35d9a69d721c 100644 --- a/src/zabbix_sender/win32/zabbix_sender.c +++ b/src/zabbix_sender/win32/zabbix_sender.c @@ -31,6 +31,8 @@ const char *help_message[] = {NULL}; unsigned char program_type = ZBX_PROGRAM_TYPE_SENDER; +int CONFIG_TCP_MAX_BACKLOG_SIZE = SOMAXCONN; + int zabbix_sender_send_values(const char *address, unsigned short port, const char *source, const zabbix_sender_value_t *values, int count, char **result) { diff --git a/src/zabbix_sender/zabbix_sender.c b/src/zabbix_sender/zabbix_sender.c index a18f50b1cf34..6713f5e0c9a1 100644 --- a/src/zabbix_sender/zabbix_sender.c +++ b/src/zabbix_sender/zabbix_sender.c @@ -293,6 +293,8 @@ char *CONFIG_TLS_CIPHER_CMD = NULL; /* parameter '--tls-cipher' from sender com int CONFIG_PASSIVE_FORKS = 0; /* not used in zabbix_sender, just for linking with tls.c */ int CONFIG_ACTIVE_FORKS = 0; /* not used in zabbix_sender, just for linking with tls.c */ +int CONFIG_TCP_MAX_BACKLOG_SIZE = SOMAXCONN; + /* COMMAND LINE OPTIONS */ /* long options */ @@ -870,6 +872,8 @@ static void zbx_load_config(const char *config_file) PARM_OPT, 0, 0}, {"TLSCipherPSK", &cfg_tls_cipher_psk, TYPE_STRING, PARM_OPT, 0, 0}, + {"ListenBacklog", &CONFIG_TCP_MAX_BACKLOG_SIZE, TYPE_INT, + PARM_OPT, 0, INT_MAX}, {NULL} }; diff --git a/src/zabbix_server/server.c b/src/zabbix_server/server.c index 627d9ef0f7d0..bdb2a8849717 100644 --- a/src/zabbix_server/server.c +++ b/src/zabbix_server/server.c @@ -333,6 +333,7 @@ char *CONFIG_HISTORY_STORAGE_OPTS = NULL; int CONFIG_HISTORY_STORAGE_PIPELINES = 0; char *CONFIG_STATS_ALLOWED_IP = NULL; +int CONFIG_TCP_MAX_BACKLOG_SIZE = SOMAXCONN; int CONFIG_DOUBLE_PRECISION = ZBX_DB_DBL_PRECISION_ENABLED; @@ -934,6 +935,8 @@ static void zbx_load_config(ZBX_TASK_EX *task) PARM_OPT, 1, 3600}, {"ServiceManagerSyncFrequency", &CONFIG_SERVICEMAN_SYNC_FREQUENCY, TYPE_INT, PARM_OPT, 1, 3600}, + {"ListenBacklog", &CONFIG_TCP_MAX_BACKLOG_SIZE, TYPE_INT, + PARM_OPT, 0, INT_MAX}, {NULL} }; diff --git a/tests/zbxmocktest.c b/tests/zbxmocktest.c index 8993ee416461..9a7408af15ed 100644 --- a/tests/zbxmocktest.c +++ b/tests/zbxmocktest.c @@ -177,6 +177,9 @@ char *CONFIG_HISTORY_STORAGE_URL = NULL; char *CONFIG_HISTORY_STORAGE_OPTS = NULL; int CONFIG_HISTORY_STORAGE_PIPELINES = 0; +/* not used in tests, defined for linking with comms.c */ +int CONFIG_TCP_MAX_BACKLOG_SIZE = SOMAXCONN; + const char title_message[] = "mock_title_message"; const char *usage_message[] = {"mock_usage_message", NULL}; const char *help_message[] = {"mock_help_message", NULL};