Offload updating cached time to dedicated thread

Former-commit-id: 9bfc8a43952481b5b54a7b051d44b8bece4a18dd
This commit is contained in:
christian 2021-02-26 00:50:22 +00:00 committed by jsully
parent 87fc018415
commit 53b7b83af6
4 changed files with 17 additions and 18 deletions

View File

@ -525,7 +525,6 @@ void handleClientsBlockedOnKeys(void) {
* lookup, invalidating the first one. * lookup, invalidating the first one.
* See https://github.com/antirez/redis/pull/6554. */ * See https://github.com/antirez/redis/pull/6554. */
serverTL->fixed_time_expire++; serverTL->fixed_time_expire++;
updateCachedTime(0);
/* Serve clients blocked on the key. */ /* Serve clients blocked on the key. */
robj *o = lookupKeyWrite(rl->db,rl->key); robj *o = lookupKeyWrite(rl->db,rl->key);

View File

@ -2341,10 +2341,6 @@ void rdbLoadProgressCallback(rio *r, const void *buf, size_t len) {
(g_pserver->loading_process_events_interval_keys && (g_pserver->loading_process_events_interval_keys &&
(r->keys_since_last_callback >= g_pserver->loading_process_events_interval_keys))) (r->keys_since_last_callback >= g_pserver->loading_process_events_interval_keys)))
{ {
/* The DB can take some non trivial amount of time to load. Update
* our cached time since it is used to create and update the last
* interaction time with clients and for other important things. */
updateCachedTime(0);
listIter li; listIter li;
listNode *ln; listNode *ln;
listRewind(g_pserver->masters, &li); listRewind(g_pserver->masters, &li);

View File

@ -2002,7 +2002,7 @@ void databasesCron(bool fMainThread) {
* info or not using the 'update_daylight_info' argument. Normally we update * info or not using the 'update_daylight_info' argument. Normally we update
* such info only when calling this function from serverCron() but not when * such info only when calling this function from serverCron() but not when
* calling it from call(). */ * calling it from call(). */
void updateCachedTime(int update_daylight_info) { void updateCachedTime() {
long long t = ustime(); long long t = ustime();
__atomic_store(&g_pserver->ustime, &t, __ATOMIC_RELAXED); __atomic_store(&g_pserver->ustime, &t, __ATOMIC_RELAXED);
t /= 1000; t /= 1000;
@ -2015,12 +2015,10 @@ void updateCachedTime(int update_daylight_info) {
* context is safe since we will never fork() while here, in the main * context is safe since we will never fork() while here, in the main
* thread. The logging function will call a thread safe version of * thread. The logging function will call a thread safe version of
* localtime that has no locks. */ * localtime that has no locks. */
if (update_daylight_info) { struct tm tm;
struct tm tm; time_t ut = g_pserver->unixtime;
time_t ut = g_pserver->unixtime; localtime_r(&ut,&tm);
localtime_r(&ut,&tm); __atomic_store(&g_pserver->daylight_active, &tm.tm_isdst, __ATOMIC_RELAXED);
__atomic_store(&g_pserver->daylight_active, &tm.tm_isdst, __ATOMIC_RELAXED);
}
} }
void checkChildrenDone(void) { void checkChildrenDone(void) {
@ -2172,9 +2170,6 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {
* handler if we don't return here fast enough. */ * handler if we don't return here fast enough. */
if (g_pserver->watchdog_period) watchdogScheduleSignal(g_pserver->watchdog_period); if (g_pserver->watchdog_period) watchdogScheduleSignal(g_pserver->watchdog_period);
/* Update the time cache. */
updateCachedTime(1);
/* Unpause clients if enough time has elapsed */ /* Unpause clients if enough time has elapsed */
unpauseClientsIfNecessary(); unpauseClientsIfNecessary();
@ -2812,7 +2807,7 @@ void initMasterInfo(redisMaster *master)
void initServerConfig(void) { void initServerConfig(void) {
int j; int j;
updateCachedTime(true); updateCachedTime();
getRandomHexChars(g_pserver->runid,CONFIG_RUN_ID_SIZE); getRandomHexChars(g_pserver->runid,CONFIG_RUN_ID_SIZE);
g_pserver->runid[CONFIG_RUN_ID_SIZE] = '\0'; g_pserver->runid[CONFIG_RUN_ID_SIZE] = '\0';
changeReplicationId(); changeReplicationId();
@ -3915,7 +3910,6 @@ void call(client *c, int flags) {
/* Call the command. */ /* Call the command. */
dirty = g_pserver->dirty; dirty = g_pserver->dirty;
updateCachedTime(0);
incrementMvccTstamp(); incrementMvccTstamp();
start = g_pserver->ustime; start = g_pserver->ustime;
try { try {
@ -6072,6 +6066,13 @@ void OnTerminate()
serverPanic("std::teminate() called"); serverPanic("std::teminate() called");
} }
void *timeThreadMain(void*) {
while (true) {
updateCachedTime();
usleep(1);
}
}
void *workerThreadMain(void *parg) void *workerThreadMain(void *parg)
{ {
int iel = (int)((int64_t)parg); int iel = (int)((int64_t)parg);
@ -6419,6 +6420,8 @@ int main(int argc, char **argv) {
setOOMScoreAdj(-1); setOOMScoreAdj(-1);
serverAssert(cserver.cthreads > 0 && cserver.cthreads <= MAX_EVENT_LOOPS); serverAssert(cserver.cthreads > 0 && cserver.cthreads <= MAX_EVENT_LOOPS);
pthread_create(&cserver.time_thread_id, nullptr, timeThreadMain, nullptr);
pthread_attr_t tattr; pthread_attr_t tattr;
pthread_attr_init(&tattr); pthread_attr_init(&tattr);
pthread_attr_setstacksize(&tattr, 1 << 23); // 8 MB pthread_attr_setstacksize(&tattr, 1 << 23); // 8 MB

View File

@ -1920,6 +1920,7 @@ struct redisServerConst {
pid_t pid; /* Main process pid. */ pid_t pid; /* Main process pid. */
time_t stat_starttime; /* Server start time */ time_t stat_starttime; /* Server start time */
pthread_t main_thread_id; /* Main thread id */ pthread_t main_thread_id; /* Main thread id */
pthread_t time_thread_id;
char *configfile; /* Absolute config file path, or NULL */ char *configfile; /* Absolute config file path, or NULL */
char *executable; /* Absolute executable file path. */ char *executable; /* Absolute executable file path. */
char **exec_argv; /* Executable argv vector (copy). */ char **exec_argv; /* Executable argv vector (copy). */
@ -2965,7 +2966,7 @@ void populateCommandTable(void);
void resetCommandTableStats(void); void resetCommandTableStats(void);
void adjustOpenFilesLimit(void); void adjustOpenFilesLimit(void);
void closeListeningSockets(int unlink_unix_socket); void closeListeningSockets(int unlink_unix_socket);
void updateCachedTime(int update_daylight_info); void updateCachedTime();
void resetServerStats(void); void resetServerStats(void);
void activeDefragCycle(void); void activeDefragCycle(void);
unsigned int getLRUClock(void); unsigned int getLRUClock(void);