2012-03-02 21 views
5

Estoy usando Redis (2.4.2) y con el comando INFO puedo leer estadísticas sobre mi servidor Redis.Restablecer Redis "used_memory_peak" stat

Hay muchas estadísticas, incluyendo algunas sobre la cantidad de memoria utilizada. Y uno es "used_memory_peak" que parece contener la cantidad máxima de memoria que Redis alguna vez ha tomado.

He eliminado un montón de claves, y me gustaría restablecer esta estadística ya que afecta la escala de mis gráficos de Munin.

Hay un comando CONFIG RESETSTAT, pero no parece afectar esta estadística en particular.

¿Alguna idea de cómo podría hacer esto, sin tener que exportar/eliminar/importar mi conjunto de datos?

EDITAR:

acuerdo con @antirez sí mismo (issue 369 on GitHub), este es un comportamiento previsto, pero esta característica podría ser mejorado para ser más útil en una versión futura.

Respuesta

4

La implementación de CONFIG RESETSTAT es bastante simple:

} else if (!strcasecmp(c->argv[1]->ptr,"resetstat")) { 
    if (c->argc != 2) goto badarity; 
    server.stat_keyspace_hits = 0; 
    server.stat_keyspace_misses = 0; 
    server.stat_numcommands = 0; 
    server.stat_numconnections = 0; 
    server.stat_expiredkeys = 0; 
    addReply(c,shared.ok); 

Por lo tanto, no inicializa el campo server.stat_peak_memory utilizado para almacenar la cantidad máxima de memoria jamás utilizado por Redis. No sé si es un error o una característica.

Aquí hay un truco para restablecer el valor sin tener que detener Redis. La idea es usar gdb en modo batch para simplemente cambiar el valor de la variable (que es parte de una estructura estática). Normalmente, Redis está compilado con símbolos de depuración.

# Here we have plenty of things in this instance 
> ./redis-cli info | grep peak 
used_memory_peak:1363052184 
used_memory_peak_human:1.27G 

# Let's do some cleaning: everything is wiped out 
# don't do this in production !!! 
> ./redis-cli flushdb 
OK 

# Again the same values, while some memory has been freed 
> ./redis-cli info | grep peak 
used_memory_peak:1363052184 
used_memory_peak_human:1.27G 

# Here is the magic command: reset the parameter with gdb (output and warnings to be ignored) 
> gdb -batch -n -ex 'set variable server.stat_peak_memory = 0' ./redis-server `pidof redis-server` 
Missing separate debuginfo for /lib64/libm.so.6 
Missing separate debuginfo for /lib64/libdl.so.2 
Missing separate debuginfo for /lib64/libpthread.so.0 
[Thread debugging using libthread_db enabled] 
[New Thread 0x41001940 (LWP 22837)] 
[New Thread 0x40800940 (LWP 22836)] 
Missing separate debuginfo for /lib64/libc.so.6 
Missing separate debuginfo for /lib64/ld-linux-x86-64.so.2 

warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff51ff000 
0x00002af0b5eef218 in epoll_wait() from /lib64/libc.so.6 

# And now, result is different: great ! 
> ./redis-cli info | grep peak 
used_memory_peak:718768 
used_memory_peak_human:701.92K 

Esto es un truco: piense dos veces antes de aplicar este truco en una instancia de producción.

+0

que es interesante, pero supongo que no voy a ir tan bajo/profundo. Gracias de todos modos por este buen consejo. – jlecour

1

simple truco para borrar la memoria repique ::

Paso 1:

/home/LogProc/Redis/bin/Redis-cli BGREWRITEAOF

esperar hasta que termine reescribiendo un archivo

Paso 2:

redis reinicio dB

Done. Eso es.