From c9d63c50c0607c9b34d67cc71b8b3a7293fa131c Mon Sep 17 00:00:00 2001 From: Alex Cope Date: Thu, 29 Jun 2023 13:22:47 -0700 Subject: [PATCH] update --- src/evict.cpp | 20 +++++++++----------- src/server.cpp | 1 + src/server.h | 1 + 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/evict.cpp b/src/evict.cpp index f4edb86fd..bd9c569ed 100644 --- a/src/evict.cpp +++ b/src/evict.cpp @@ -425,16 +425,14 @@ int getMaxmemoryState(size_t *total, size_t *logical, size_t *tofree, float *lev if (g_pserver->FRdbSaveInProgress()) maxmemory = static_cast(maxmemory*1.2); - /* If rss memory exceeds configurable percent of system memory, force eviction */ - bool mem_rss_max_exceeded; + /* If free system memory is below a certain threshold, force eviction */ + size_t sys_free_mem_buffer; if (g_pserver->force_eviction_percent && g_pserver->cron_malloc_stats.sys_total) { - float sys_total_ratio = (float)(g_pserver->force_eviction_percent)/100; - size_t mem_rss_max = static_cast(g_pserver->cron_malloc_stats.sys_total * sys_total_ratio); - mem_rss_max_exceeded = g_pserver->cron_malloc_stats.process_rss > mem_rss_max; - if (mem_rss_max_exceeded) { - /* This will always set maxmemory < mem_reported */ - float frag_ratio = (float)g_pserver->cron_malloc_stats.process_rss / (float)mem_reported; - maxmemory = static_cast((float)mem_rss_max / frag_ratio); + float free_mem_ratio = (float)(100 - g_pserver->force_eviction_percent)/100; + size_t min_free_mem = static_cast(g_pserver->cron_malloc_stats.sys_total * free_mem_ratio); + sys_free_mem_buffer = static_cast(g_pserver->cron_malloc_stats.sys_free - min_free_mem); + if (sys_free_mem_buffer < 0) { + maxmemory = static_cast(mem_reported + sys_free_mem_buffer); } } @@ -448,9 +446,9 @@ int getMaxmemoryState(size_t *total, size_t *logical, size_t *tofree, float *lev size_t overhead = freeMemoryGetNotCountedMemory(); mem_used = (mem_used > overhead) ? mem_used-overhead : 0; - /* If we've exceeded max RSS memory, we want to force evictions no matter + /* If system free memory is too low, we want to force evictions no matter * what so we also offset the overhead from maxmemory. */ - if (mem_rss_max_exceeded) { + if (sys_free_mem_buffer < 0) { maxmemory = (maxmemory > overhead) ? maxmemory-overhead : 0; } diff --git a/src/server.cpp b/src/server.cpp index d1ef097c4..9887c0e58 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2319,6 +2319,7 @@ void cronUpdateMemoryStats() { memset(&sysinf, 0, sizeof sysinf); if (!sysinfo(&sysinf)) { g_pserver->cron_malloc_stats.sys_total = static_cast(sysinf.totalram); + g_pserver->cron_malloc_stats.sys_free = static_cast(sysinf.freeram); } #endif diff --git a/src/server.h b/src/server.h index 0ad934d8d..d04aeccad 100644 --- a/src/server.h +++ b/src/server.h @@ -2015,6 +2015,7 @@ struct malloc_stats { size_t allocator_active; size_t allocator_resident; size_t sys_total; + size_t sys_free; }; typedef struct socketFds {