Commit b3624f5a authored by antirez's avatar antirez
Browse files

activeExpireCycle(): better precision in max time used.

activeExpireCycle() can consume no more than a few milliseconds per
iteration. This commit improves the precision of the check for the time
elapsed in two ways:

1) We check every 16 iterations instead of the main loop instead of 256.
2) We reset iterations at the start of the function and not every time
   we switch to the next database, so the check is correctly performed
   every 16 iterations.
parent 61daf891
...@@ -627,7 +627,7 @@ void updateDictResizePolicy(void) { ...@@ -627,7 +627,7 @@ void updateDictResizePolicy(void) {
* it will get more aggressive to avoid that too much memory is used by * it will get more aggressive to avoid that too much memory is used by
* keys that can be removed from the keyspace. */ * keys that can be removed from the keyspace. */
void activeExpireCycle(void) { void activeExpireCycle(void) {
int j; int j, iteration = 0;
long long start = ustime(), timelimit; long long start = ustime(), timelimit;
/* We can use at max REDIS_EXPIRELOOKUPS_TIME_PERC percentage of CPU time /* We can use at max REDIS_EXPIRELOOKUPS_TIME_PERC percentage of CPU time
...@@ -638,7 +638,7 @@ void activeExpireCycle(void) { ...@@ -638,7 +638,7 @@ void activeExpireCycle(void) {
if (timelimit <= 0) timelimit = 1; if (timelimit <= 0) timelimit = 1;
for (j = 0; j < server.dbnum; j++) { for (j = 0; j < server.dbnum; j++) {
int expired, iteration = 0; int expired;
redisDb *db = server.db+j; redisDb *db = server.db+j;
/* Continue to expire if at the end of the cycle more than 25% /* Continue to expire if at the end of the cycle more than 25%
...@@ -654,6 +654,8 @@ void activeExpireCycle(void) { ...@@ -654,6 +654,8 @@ void activeExpireCycle(void) {
if (num && slots > DICT_HT_INITIAL_SIZE && if (num && slots > DICT_HT_INITIAL_SIZE &&
(num*100/slots < 1)) break; (num*100/slots < 1)) break;
/* The main collection cycle. Sample random keys among keys
* with an expire set, checking for expired ones. */
expired = 0; expired = 0;
if (num > REDIS_EXPIRELOOKUPS_PER_CRON) if (num > REDIS_EXPIRELOOKUPS_PER_CRON)
num = REDIS_EXPIRELOOKUPS_PER_CRON; num = REDIS_EXPIRELOOKUPS_PER_CRON;
...@@ -678,7 +680,7 @@ void activeExpireCycle(void) { ...@@ -678,7 +680,7 @@ void activeExpireCycle(void) {
* expire. So after a given amount of milliseconds return to the * expire. So after a given amount of milliseconds return to the
* caller waiting for the other active expire cycle. */ * caller waiting for the other active expire cycle. */
iteration++; iteration++;
if ((iteration & 0xff) == 0 && /* Check once every 255 iterations */ if ((iteration & 0xf) == 0 && /* check once every 16 cycles. */
(ustime()-start) > timelimit) return; (ustime()-start) > timelimit) return;
} while (expired > REDIS_EXPIRELOOKUPS_PER_CRON/4); } while (expired > REDIS_EXPIRELOOKUPS_PER_CRON/4);
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment