From 6f15ce125cfe0c8a6ebe8d56b7fcb30d9169e7cf Mon Sep 17 00:00:00 2001 From: John Sully Date: Sat, 4 Apr 2020 22:58:17 -0400 Subject: [PATCH] Add the ability to set a starting core # when setting thread affinity Former-commit-id: 9e2e2067c6df5919f1c6b8b9e6e3457c7edc0755 --- src/config.cpp | 10 ++++++++-- src/networking.cpp | 2 +- src/server.cpp | 5 +++-- src/server.h | 1 + 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/config.cpp b/src/config.cpp index 4035ca376..70448a916 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -782,8 +782,14 @@ void loadServerConfigFromString(char *config) { } else if (strcasecmp(argv[1], "false") == 0) { cserver.fThreadAffinity = FALSE; } else { - err = "Unknown argument: server-thread-affinity expects either true or false"; - goto loaderr; + int offset = atoi(argv[1]); + if (offset > 0) { + cserver.fThreadAffinity = TRUE; + cserver.threadAffinityOffset = offset-1; + } else { + err = "Unknown argument: server-thread-affinity expects either true or false"; + goto loaderr; + } } } else if (!strcasecmp(argv[0], "active-replica") && argc == 2) { g_pserver->fActiveReplica = yesnotoi(argv[1]); diff --git a/src/networking.cpp b/src/networking.cpp index 276095715..fb7d286c6 100644 --- a/src/networking.cpp +++ b/src/networking.cpp @@ -1073,7 +1073,7 @@ static void acceptCommonHandler(int fd, int flags, char *ip, int iel) { // Set thread affinity if (cserver.fThreadAffinity) { - int cpu = iel; + int cpu = iel + cserver.threadAffinityOffset; if (setsockopt(fd, SOL_SOCKET, SO_INCOMING_CPU, &cpu, sizeof(iel)) != 0) { serverLog(LL_WARNING, "Failed to set socket affinity"); diff --git a/src/server.cpp b/src/server.cpp index 4efe103ab..0c4b3116c 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2547,6 +2547,7 @@ void initServerConfig(void) { /* Multithreading */ cserver.cthreads = CONFIG_DEFAULT_THREADS; cserver.fThreadAffinity = CONFIG_DEFAULT_THREAD_AFFINITY; + cserver.threadAffinityOffset = 0; } extern char **environ; @@ -5350,10 +5351,10 @@ int main(int argc, char **argv) { #ifdef __linux__ cpu_set_t cpuset; CPU_ZERO(&cpuset); - CPU_SET(iel, &cpuset); + CPU_SET(iel + cserver.threadAffinityOffset, &cpuset); if (pthread_setaffinity_np(rgthread[iel], sizeof(cpu_set_t), &cpuset) == 0) { - serverLog(LOG_INFO, "Binding thread %d to cpu %d", iel, iel); + serverLog(LOG_INFO, "Binding thread %d to cpu %d", iel, iel + cserver.threadAffinityOffset + 1); } #else serverLog(LL_WARNING, "CPU pinning not available on this platform"); diff --git a/src/server.h b/src/server.h index 307321bab..5d5f4b3e0 100644 --- a/src/server.h +++ b/src/server.h @@ -1574,6 +1574,7 @@ struct redisServerConst { int cthreads; /* Number of main worker threads */ int fThreadAffinity; /* Should we pin threads to cores? */ + int threadAffinityOffset = 0; /* Where should we start pinning them? */ char *pidfile; /* PID file path */ /* Fast pointers to often looked up command */