現象
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`