swapping algorithm a bit more aggressive under low memory

This commit is contained in:
antirez 2010-01-05 13:16:41 -05:00
parent 4ef8de8ad7
commit e3cadb8abe

19
redis.c
View File

@ -2190,6 +2190,11 @@ static void addReply(redisClient *c, robj *obj) {
c->replstate == REDIS_REPL_ONLINE) && c->replstate == REDIS_REPL_ONLINE) &&
aeCreateFileEvent(server.el, c->fd, AE_WRITABLE, aeCreateFileEvent(server.el, c->fd, AE_WRITABLE,
sendReplyToClient, c) == AE_ERR) return; sendReplyToClient, c) == AE_ERR) return;
if (server.vm_enabled && obj->storage != REDIS_VM_MEMORY) {
obj = dupStringObject(obj);
obj->refcount = 0; /* getDecodedObject() will increment the refcount */
}
listAddNodeTail(c->reply,getDecodedObject(obj)); listAddNodeTail(c->reply,getDecodedObject(obj));
} }
@ -6930,16 +6935,21 @@ static int vmSwapOneObject(void) {
for (j = 0; j < server.dbnum; j++) { for (j = 0; j < server.dbnum; j++) {
redisDb *db = server.db+j; redisDb *db = server.db+j;
int maxtries = 1000;
if (dictSize(db->dict) == 0) continue; if (dictSize(db->dict) == 0) continue;
for (i = 0; i < 5; i++) { for (i = 0; i < 5; i++) {
dictEntry *de; dictEntry *de;
double swappability; double swappability;
if (maxtries) maxtries--;
de = dictGetRandomKey(db->dict); de = dictGetRandomKey(db->dict);
key = dictGetEntryKey(de); key = dictGetEntryKey(de);
val = dictGetEntryVal(de); val = dictGetEntryVal(de);
if (key->storage != REDIS_VM_MEMORY) continue; if (key->storage != REDIS_VM_MEMORY) {
if (maxtries) i--; /* don't count this try */
continue;
}
swappability = computeObjectSwappability(val); swappability = computeObjectSwappability(val);
if (!best || swappability > best_swappability) { if (!best || swappability > best_swappability) {
best = de; best = de;
@ -6947,11 +6957,14 @@ static int vmSwapOneObject(void) {
} }
} }
} }
if (best == NULL) return REDIS_ERR; if (best == NULL) {
redisLog(REDIS_DEBUG,"No swappable key found!");
return REDIS_ERR;
}
key = dictGetEntryKey(best); key = dictGetEntryKey(best);
val = dictGetEntryVal(best); val = dictGetEntryVal(best);
redisLog(REDIS_DEBUG,"Key with best swappability: %s, %f\n", redisLog(REDIS_DEBUG,"Key with best swappability: %s, %f",
key->ptr, best_swappability); key->ptr, best_swappability);
/* Unshare the key if needed */ /* Unshare the key if needed */