Add the ability to set a starting core # when setting thread affinity
Former-commit-id: 9e2e2067c6df5919f1c6b8b9e6e3457c7edc0755
This commit is contained in:
parent
662a1b6a42
commit
6f15ce125c
@ -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) {
|
||||||
|
@ -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");
|
||||||
|
@ -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");
|
||||||
|
@ -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 */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user