diff --git a/src/config.h b/src/config.h index 57d07599a57868a6c861e889a1ee7db2ddf11147..1f2919ed21a89025877f4b0ab45a03ef869b8a8b 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 25f9e568c5d783cc09ed8726f62627b824b6186a..32b54e4fcec759abf779a860f82f120bb03ce899 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) {