重置Redis“used_memory_peak”stat

时间:2012-03-02 15:23:29

标签: redis

我正在使用Redis(2.4.2),使用INFO命令,我可以读取有关我的Redis服务器的统计信息。

有许多统计数据,包括一些关于使用了多少内存的数据。一个是“used_memory_peak”,它似乎拥有Redis所拥有的最大内存量。

我删除了一堆密钥,我想重置此统计信息,因为它会影响我的Munin图表的比例。

有一个CONFIG RESETSTAT命令,但它似乎不会影响这个特定的统计数据。

任何想法我怎么能这样做,而不必导出/删除/导入我的数据集?

编辑

根据@antirez本人(issue 369 on GitHub)的说法,这是一种预期的行为,但是这个功能可以在未来版本中更有用。

2 个答案:

答案 0 :(得分:4)

CONFIG RESETSTAT的实现非常简单:

} 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);

因此它不会初始化用于存储Redis使用的最大内存量的server.stat_peak_memory字段。我不知道这是一个错误还是一个功能。

这是一个重置值而不必停止Redis的黑客攻击。我们的想法是在批处理模式下使用gdb来改变变量的值(它是静态结构的一部分)。通常,Redis是使用调试符号编译的。

# 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

这是一个黑客攻击:在生产实例上应用此技巧之前请三思而后行。

答案 1 :(得分:2)

清除peal内存的简单技巧::

第1步:

  

/ home / logproc / redis / bin / redis-cli BGREWRITEAOF

等到它完成重写aof文件。

第2步:

  

重启redis db

完成。多数民众赞成。