From c3846becae5528e2987865ec1a5ef2cdeca3dadd Mon Sep 17 00:00:00 2001 From: antirez Date: Thu, 4 Dec 2014 10:54:31 +0100 Subject: [PATCH] Check that tcp-backlog is matched by /proc/sys/net/core/somaxconn. --- src/config.h | 1 + src/redis.c | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/config.h b/src/config.h index 57d07599..1f2919ed 100644 --- a/src/config.h +++ b/src/config.h @@ -48,6 +48,7 @@ #define HAVE_PROC_STAT 1 #define HAVE_PROC_MAPS 1 #define HAVE_PROC_SMAPS 1 +#define HAVE_PROC_SOMAXCONN 1 #endif /* Test for task_info() */ diff --git a/src/redis.c b/src/redis.c index 25f9e568..32b54e4f 100644 --- a/src/redis.c +++ b/src/redis.c @@ -1621,6 +1621,23 @@ 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 + FILE *fp = fopen("/proc/sys/net/core/somaxconn","r"); + char buf[1024]; + if (!fp) return; + if (fgets(buf,sizeof(buf),fp) != NULL) { + int somaxconn = atoi(buf); + if (somaxconn > 0 && somaxconn < server.tcp_backlog) { + redisLog(REDIS_WARNING,"WARNING: The TCP backlog setting of %d cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of %d.", server.tcp_backlog, somaxconn); + } + } + fclose(fp); +#endif +} + /* Initialize a set of file descriptors to listen to the specified 'port' * binding the addresses specified in the Redis server configuration. * @@ -3648,6 +3665,7 @@ int main(int argc, char **argv) { #ifdef __linux__ linuxMemoryWarnings(); #endif + checkTcpBacklogSettings(); loadDataFromDisk(); if (server.cluster_enabled) { if (verifyClusterConfigWithData() == REDIS_ERR) {