summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOran Agra <oran@redislabs.com>2020-10-18 16:56:43 +0300
committerGitHub <noreply@github.com>2020-10-18 16:56:43 +0300
commit457b7073b5d512c10aaeeb0dbf1763f0cb10462c (patch)
tree75644678b6210d9b344b33f60fe9fa749a35cbe1
parentef92f507dd0c402a916c16435e7f3f92598b7242 (diff)
downloadredis-457b7073b5d512c10aaeeb0dbf1763f0cb10462c.tar.gz
INFO report peak memory before eviction (#7894)
In some cases one command added a very big bulk of memory, and this would be "resolved" by the eviction before the next command. Seeing an unexplained mass eviction we would wish to know the highest momentary usage too. Tracking it in call() and beforeSleep() adds some hooks in AOF and RDB loading. The fix in clientsCronTrackExpansiveClients is related to #7874
-rw-r--r--src/server.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/server.c b/src/server.c
index 6abb368a8..43d7c337c 100644
--- a/src/server.c
+++ b/src/server.c
@@ -1599,7 +1599,7 @@ size_t ClientsPeakMemInput[CLIENTS_PEAK_MEM_USAGE_SLOTS];
size_t ClientsPeakMemOutput[CLIENTS_PEAK_MEM_USAGE_SLOTS];
int clientsCronTrackExpansiveClients(client *c) {
- size_t in_usage = sdsAllocSize(c->querybuf);
+ size_t in_usage = sdsZmallocSize(c->querybuf) + c->argv_len_sum;
size_t out_usage = getClientOutputBufferMemoryUsage(c);
int i = server.unixtime % CLIENTS_PEAK_MEM_USAGE_SLOTS;
int zeroidx = (i+1) % CLIENTS_PEAK_MEM_USAGE_SLOTS;
@@ -2200,6 +2200,10 @@ extern int ProcessingEventsWhileBlocked;
void beforeSleep(struct aeEventLoop *eventLoop) {
UNUSED(eventLoop);
+ size_t zmalloc_used = zmalloc_used_memory();
+ if (zmalloc_used > server.stat_peak_memory)
+ server.stat_peak_memory = zmalloc_used;
+
/* Just call a subset of vital functions in case we are re-entering
* the event loop from processEventsWhileBlocked(). Note that in this
* case we keep track of the number of events we are processing, since
@@ -3581,6 +3585,12 @@ void call(client *c, int flags) {
server.fixed_time_expire--;
server.stat_numcommands++;
+
+ /* Record peak memory after each command and before the eviction that runs
+ * before the next command. */
+ size_t zmalloc_used = zmalloc_used_memory();
+ if (zmalloc_used > server.stat_peak_memory)
+ server.stat_peak_memory = zmalloc_used;
}
/* Used when a command that is ready for execution needs to be rejected, due to