used_memory_peakを初期化する(redis-cli)


現象

Redisがやたらメモリを使用していたので、不具合を解消。
それにより使用メモリが下がった。
だが、used_memory_peak(used_memory_peak_human)が大きいままなので初期化したい。

状況を確認

使用メモリが下がったが、peak値が多いまま。

$ redis-cli info | grep "used_memory_human:\|used_memory_peak_human:"
used_memory_human:45.93M
used_memory_peak_human:167.99M

flushdbしてみる。

$ redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> flushdb
OK

だがしかし、peak値は変わらず…

$ redis-cli info | grep "used_memory_human:\|used_memory_peak_human:"
used_memory_human:43.96M
used_memory_peak_human:167.99M

初期化方法

以下のコマンドを実行。

$ sudo gdb -batch -n -ex 'set variable server.stat_peak_memory = 0' /usr/local/bin/redis-server `pidof redis-server`
[New LWP 2928]
[New LWP 2927]
[Thread debugging using libthread_db enabled]
0x00007f78a6f19ef3 in epoll_wait () from /lib64/libc.so.6

下がった!

$ redis-cli info | grep "used_memory_human:\|used_memory_peak_human:"
used_memory_human:43.96M
used_memory_peak_human:43.96M

なぜか?

Redisのソースを見た感じだと、変数で保持している最大値以上の値にならない限り、peak値が変わることはなさそう。
https://hyposta.tk/C_Folio/redis/doxygen/doc/3.0.0/view/redis_8c_source.html
↑1101行目あたり

     /* Record the max memory used since the server was started. */
     if (zmalloc_used_memory() > server.stat_peak_memory)
         server.stat_peak_memory = zmalloc_used_memory();

なので、gdbコマンドで変数server.stat_peak_memoryの値を一旦ゼロにしてしまう。

$ sudo gdb -batch -n -ex 'set variable server.stat_peak_memory = 0' /usr/local/bin/redis-server `pidof redis-server`
  • このエントリーをはてなブックマークに追加