diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/evict.c | 26 | ||||
-rw-r--r-- | src/server.c | 8 | ||||
-rw-r--r-- | src/server.h | 2 |
3 files changed, 31 insertions, 5 deletions
diff --git a/src/evict.c b/src/evict.c index 5fdcd4134..7a2befdd2 100644 --- a/src/evict.c +++ b/src/evict.c @@ -510,6 +510,8 @@ static unsigned long evictionTimeLimitUs() { * EVICT_FAIL - memory is over the limit, and there's nothing to evict * */ int performEvictions(void) { + /* Note, we don't goto update_metrics here because this check skips eviction + * as if it wasn't triggered. it's a fake EVICT_OK. */ if (!isSafeToPerformEvictions()) return EVICT_OK; int keys_freed = 0; @@ -520,11 +522,15 @@ int performEvictions(void) { int slaves = listLength(server.slaves); int result = EVICT_FAIL; - if (getMaxmemoryState(&mem_reported,NULL,&mem_tofree,NULL) == C_OK) - return EVICT_OK; + if (getMaxmemoryState(&mem_reported,NULL,&mem_tofree,NULL) == C_OK) { + result = EVICT_OK; + goto update_metrics; + } - if (server.maxmemory_policy == MAXMEMORY_NO_EVICTION) - return EVICT_FAIL; /* We need to free memory, but policy forbids. */ + if (server.maxmemory_policy == MAXMEMORY_NO_EVICTION) { + result = EVICT_FAIL; /* We need to free memory, but policy forbids. */ + goto update_metrics; + } unsigned long eviction_time_limit_us = evictionTimeLimitUs(); @@ -705,6 +711,16 @@ cant_free: latencyEndMonitor(latency); latencyAddSampleIfNeeded("eviction-cycle",latency); + +update_metrics: + if (result == EVICT_RUNNING || result == EVICT_FAIL) { + if (server.stat_last_eviction_exceeded_time == 0) + elapsedStart(&server.stat_last_eviction_exceeded_time); + } else if (result == EVICT_OK) { + if (server.stat_last_eviction_exceeded_time != 0) { + server.stat_total_eviction_exceeded_time += elapsedUs(server.stat_last_eviction_exceeded_time); + server.stat_last_eviction_exceeded_time = 0; + } + } return result; } - diff --git a/src/server.c b/src/server.c index aeed6584a..4d1a9ac5c 100644 --- a/src/server.c +++ b/src/server.c @@ -3092,6 +3092,8 @@ void resetServerStats(void) { server.stat_expired_time_cap_reached_count = 0; server.stat_expire_cycle_time_used = 0; server.stat_evictedkeys = 0; + server.stat_total_eviction_exceeded_time = 0; + server.stat_last_eviction_exceeded_time = 0; server.stat_keyspace_misses = 0; server.stat_keyspace_hits = 0; server.stat_active_defrag_hits = 0; @@ -4984,6 +4986,8 @@ sds genRedisInfoString(const char *section) { if (allsections || defsections || !strcasecmp(section,"stats")) { long long stat_total_reads_processed, stat_total_writes_processed; long long stat_net_input_bytes, stat_net_output_bytes; + long long current_eviction_exceeded_time = server.stat_last_eviction_exceeded_time ? + (long long) elapsedUs(server.stat_last_eviction_exceeded_time): 0; atomicGet(server.stat_total_reads_processed, stat_total_reads_processed); atomicGet(server.stat_total_writes_processed, stat_total_writes_processed); atomicGet(server.stat_net_input_bytes, stat_net_input_bytes); @@ -5008,6 +5012,8 @@ sds genRedisInfoString(const char *section) { "expired_time_cap_reached_count:%lld\r\n" "expire_cycle_cpu_milliseconds:%lld\r\n" "evicted_keys:%lld\r\n" + "total_eviction_exceeded_time:%lld\r\n" + "current_eviction_exceeded_time:%lld\r\n" "keyspace_hits:%lld\r\n" "keyspace_misses:%lld\r\n" "pubsub_channels:%ld\r\n" @@ -5046,6 +5052,8 @@ sds genRedisInfoString(const char *section) { server.stat_expired_time_cap_reached_count, server.stat_expire_cycle_time_used/1000, server.stat_evictedkeys, + (server.stat_total_eviction_exceeded_time + current_eviction_exceeded_time) / 1000, + current_eviction_exceeded_time / 1000, server.stat_keyspace_hits, server.stat_keyspace_misses, dictSize(server.pubsub_channels), diff --git a/src/server.h b/src/server.h index a7e2f49d2..cab2aaf12 100644 --- a/src/server.h +++ b/src/server.h @@ -1312,6 +1312,8 @@ struct redisServer { long long stat_expired_time_cap_reached_count; /* Early expire cycle stops.*/ long long stat_expire_cycle_time_used; /* Cumulative microseconds used. */ long long stat_evictedkeys; /* Number of evicted keys (maxmemory) */ + long long stat_total_eviction_exceeded_time; /* Total time over the memory limit, unit us */ + monotime stat_last_eviction_exceeded_time; /* Timestamp of current eviction start, unit us */ long long stat_keyspace_hits; /* Number of successful lookups of keys */ long long stat_keyspace_misses; /* Number of failed lookups of keys */ long long stat_active_defrag_hits; /* number of allocations moved */ |