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;
} else if (strcasecmp(argv[1], "false") == 0) {
cserver.fThreadAffinity = FALSE;
} else {
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]);
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
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");

View File

@ -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");

View File

@ -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 */