From 2c5573e894dd7c64d2afd03c4934c30ff333fc8f Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Tue, 28 Dec 2021 07:20:10 +0000 Subject: [PATCH] Check somaxconn system settings on macOS, FreeBSD and OpenBSD. (#9972) Co-authored-by: Yossi Gottlieb --- src/config.h | 7 +++++++ src/server.c | 31 ++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/config.h b/src/config.h index da29e4cd1..210e55a87 100644 --- a/src/config.h +++ b/src/config.h @@ -63,6 +63,13 @@ #define HAVE_TASKINFO 1 #endif +/* Test for somaxconn check */ +#if defined(__APPLE__) || defined(__FreeBSD__) +#define HAVE_SYSCTL_KIPC_SOMAXCONN 1 +#elif defined(__OpenBSD__) +#define HAVE_SYSCTL_KERN_SOMAXCONN 1 +#endif + /* Test for backtrace() */ #if defined(__APPLE__) || (defined(__linux__) && defined(__GLIBC__)) || \ defined(__FreeBSD__) || ((defined(__OpenBSD__) || defined(__NetBSD__)) && defined(USE_BACKTRACE))\ diff --git a/src/server.c b/src/server.c index fa40771ab..046f9ac74 100644 --- a/src/server.c +++ b/src/server.c @@ -64,6 +64,10 @@ #include #endif +#if defined(HAVE_SYSCTL_KIPC_SOMAXCONN) || defined(HAVE_SYSCTL_KERN_SOMAXCONN) +#include +#endif + /* Our shared "common" objects */ struct sharedObjectsStruct shared; @@ -2028,7 +2032,7 @@ void adjustOpenFilesLimit(void) { /* Check that server.tcp_backlog can be actually enforced in Linux according * to the value of /proc/sys/net/core/somaxconn, or warn about it. */ void checkTcpBacklogSettings(void) { -#ifdef HAVE_PROC_SOMAXCONN +#if defined(HAVE_PROC_SOMAXCONN) FILE *fp = fopen("/proc/sys/net/core/somaxconn","r"); char buf[1024]; if (!fp) return; @@ -2039,6 +2043,31 @@ void checkTcpBacklogSettings(void) { } } fclose(fp); +#elif defined(HAVE_SYSCTL_KIPC_SOMAXCONN) + int somaxconn, mib[3]; + size_t len = sizeof(int); + + mib[0] = CTL_KERN; + mib[1] = KERN_IPC; + mib[2] = KIPC_SOMAXCONN; + + if (sysctl(mib, 3, &somaxconn, &len, NULL, 0) == 0) { + if (somaxconn > 0 && somaxconn < server.tcp_backlog) { + serverLog(LL_WARNING,"WARNING: The TCP backlog setting of %d cannot be enforced because kern.ipc.somaxconn is set to the lower value of %d.", server.tcp_backlog, somaxconn); + } + } +#elif defined(HAVE_SYSCTL_KERN_SOMAXCONN) + int somaxconn, mib[2]; + size_t len = sizeof(int); + + mib[0] = CTL_KERN; + mib[1] = KERN_SOMAXCONN; + + if (sysctl(mib, 2, &somaxconn, &len, NULL, 0) == 0) { + if (somaxconn > 0 && somaxconn < server.tcp_backlog) { + serverLog(LL_WARNING,"WARNING: The TCP backlog setting of %d cannot be enforced because kern.somaxconn is set to the lower value of %d.", server.tcp_backlog, somaxconn); + } + } #endif }