Add the ability to set a starting core # when setting thread affinity

Former-commit-id: 9e2e2067c6df5919f1c6b8b9e6e3457c7edc0755
This commit is contained in:
John Sully 2020-04-04 22:58:17 -04:00
parent 662a1b6a42
commit 6f15ce125c
4 changed files with 13 additions and 5 deletions

View File

@ -781,10 +781,16 @@ void loadServerConfigFromString(char *config) {
cserver.fThreadAffinity = TRUE; cserver.fThreadAffinity = TRUE;
} else if (strcasecmp(argv[1], "false") == 0) { } else if (strcasecmp(argv[1], "false") == 0) {
cserver.fThreadAffinity = FALSE; cserver.fThreadAffinity = FALSE;
} else {
int offset = atoi(argv[1]);
if (offset > 0) {
cserver.fThreadAffinity = TRUE;
cserver.threadAffinityOffset = offset-1;
} else { } else {
err = "Unknown argument: server-thread-affinity expects either true or false"; err = "Unknown argument: server-thread-affinity expects either true or false";
goto loaderr; goto loaderr;
} }
}
} else if (!strcasecmp(argv[0], "active-replica") && argc == 2) { } else if (!strcasecmp(argv[0], "active-replica") && argc == 2) {
g_pserver->fActiveReplica = yesnotoi(argv[1]); g_pserver->fActiveReplica = yesnotoi(argv[1]);
if (g_pserver->repl_slave_ro) { if (g_pserver->repl_slave_ro) {

View File

@ -1073,7 +1073,7 @@ static void acceptCommonHandler(int fd, int flags, char *ip, int iel) {
// Set thread affinity // Set thread affinity
if (cserver.fThreadAffinity) if (cserver.fThreadAffinity)
{ {
int cpu = iel; int cpu = iel + cserver.threadAffinityOffset;
if (setsockopt(fd, SOL_SOCKET, SO_INCOMING_CPU, &cpu, sizeof(iel)) != 0) if (setsockopt(fd, SOL_SOCKET, SO_INCOMING_CPU, &cpu, sizeof(iel)) != 0)
{ {
serverLog(LL_WARNING, "Failed to set socket affinity"); serverLog(LL_WARNING, "Failed to set socket affinity");

View File

@ -2547,6 +2547,7 @@ void initServerConfig(void) {
/* Multithreading */ /* Multithreading */
cserver.cthreads = CONFIG_DEFAULT_THREADS; cserver.cthreads = CONFIG_DEFAULT_THREADS;
cserver.fThreadAffinity = CONFIG_DEFAULT_THREAD_AFFINITY; cserver.fThreadAffinity = CONFIG_DEFAULT_THREAD_AFFINITY;
cserver.threadAffinityOffset = 0;
} }
extern char **environ; extern char **environ;
@ -5350,10 +5351,10 @@ int main(int argc, char **argv) {
#ifdef __linux__ #ifdef __linux__
cpu_set_t cpuset; cpu_set_t cpuset;
CPU_ZERO(&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) 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 #else
serverLog(LL_WARNING, "CPU pinning not available on this platform"); serverLog(LL_WARNING, "CPU pinning not available on this platform");

View File

@ -1574,6 +1574,7 @@ struct redisServerConst {
int cthreads; /* Number of main worker threads */ int cthreads; /* Number of main worker threads */
int fThreadAffinity; /* Should we pin threads to cores? */ int fThreadAffinity; /* Should we pin threads to cores? */
int threadAffinityOffset = 0; /* Where should we start pinning them? */
char *pidfile; /* PID file path */ char *pidfile; /* PID file path */
/* Fast pointers to often looked up command */ /* Fast pointers to often looked up command */