mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-22 16:18:28 -05:00
swapping algorithm a bit more aggressive under low memory
This commit is contained in:
parent
4ef8de8ad7
commit
e3cadb8abe
19
redis.c
19
redis.c
@ -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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user