From 356f9239138ebe4a27cefe9c7d3998a50c75526c Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 1 Jun 2010 15:01:16 +0200 Subject: [PATCH 1/3] TODO updated with syslog plans for 2.2 --- TODO | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO b/TODO index d9a6e61b..b7d139e9 100644 --- a/TODO +++ b/TODO @@ -4,6 +4,7 @@ Redis TODO and Roadmap VERSION 2.2 TODO (Optimizations and latency) ============================================ +* Support for syslog(3). * Lower the CPU usage. * Lower the RAM usage everywhere possible. * Specially encoded Sets (like Hashes). From 7e02fe32d3b95a9c56490b381784e47e2d97dedf Mon Sep 17 00:00:00 2001 From: antirez Date: Wed, 2 Jun 2010 15:13:53 +0200 Subject: [PATCH 2/3] better swapout policy while loading RDB file --- redis.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/redis.c b/redis.c index 949bb58e..9352356d 100644 --- a/redis.c +++ b/redis.c @@ -4120,6 +4120,7 @@ static int rdbLoad(char *filename) { } while(1) { robj *key, *val; + int force_swapout; expiretime = -1; /* Read type. */ @@ -4184,9 +4185,13 @@ static int rdbLoad(char *filename) { continue; } + force_swapout = 0; + if ((zmalloc_used_memory() - server.vm_max_memory) > 1024*1024*32) + force_swapout = 1; + /* If we have still some hope of having some value fitting memory * then we try random sampling. */ - if (!swap_all_values && server.vm_enabled && (loadedkeys % 5000) == 0) { + if (!swap_all_values && server.vm_enabled && force_swapout) { while (zmalloc_used_memory() > server.vm_max_memory) { if (vmSwapOneObjectBlocking() == REDIS_ERR) break; } From a89b7013ff5aa27fae4d1f7d45615349c3ab7300 Mon Sep 17 00:00:00 2001 From: antirez Date: Wed, 2 Jun 2010 15:18:22 +0200 Subject: [PATCH 3/3] smarter swapout policy on AOF too --- redis.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/redis.c b/redis.c index 9352356d..8b5ddae2 100644 --- a/redis.c +++ b/redis.c @@ -4101,7 +4101,6 @@ static int rdbLoad(char *filename) { redisDb *db = server.db+0; char buf[1024]; time_t expiretime, now = time(NULL); - long long loadedkeys = 0; fp = fopen(filename,"r"); if (!fp) return REDIS_ERR; @@ -4159,7 +4158,6 @@ static int rdbLoad(char *filename) { redisLog(REDIS_WARNING,"Loading DB, duplicated key (%s) found! Unrecoverable error, exiting now.", key->ptr); exit(1); } - loadedkeys++; /* Set the expire time if needed */ if (expiretime != -1) setExpire(db,key,expiretime); @@ -4185,6 +4183,7 @@ static int rdbLoad(char *filename) { continue; } + /* Flush data on disk once 32 MB of additional RAM are used... */ force_swapout = 0; if ((zmalloc_used_memory() - server.vm_max_memory) > 1024*1024*32) force_swapout = 1; @@ -8409,7 +8408,6 @@ int loadAppendOnlyFile(char *filename) { struct redisClient *fakeClient; FILE *fp = fopen(filename,"r"); struct redis_stat sb; - unsigned long long loadedkeys = 0; int appendonly = server.appendonly; if (redis_fstat(fileno(fp),&sb) != -1 && sb.st_size == 0) @@ -8432,6 +8430,7 @@ int loadAppendOnlyFile(char *filename) { char buf[128]; sds argsds; struct redisCommand *cmd; + int force_swapout; if (fgets(buf,sizeof(buf),fp) == NULL) { if (feof(fp)) @@ -8472,8 +8471,11 @@ int loadAppendOnlyFile(char *filename) { for (j = 0; j < argc; j++) decrRefCount(argv[j]); zfree(argv); /* Handle swapping while loading big datasets when VM is on */ - loadedkeys++; - if (server.vm_enabled && (loadedkeys % 5000) == 0) { + force_swapout = 0; + if ((zmalloc_used_memory() - server.vm_max_memory) > 1024*1024*32) + force_swapout = 1; + + if (server.vm_enabled && force_swapout) { while (zmalloc_used_memory() > server.vm_max_memory) { if (vmSwapOneObjectBlocking() == REDIS_ERR) break; }