22

Redis はデータの保存に使用されますが、大量のメモリが必要であり、そのメモリ使用量は最大 52.5% です。redis のキーの半分を削除しました。削除操作のリターン コードは問題ありませんが、メモリ使用量は減少しません。

どういう理由ですか?前もって感謝します。

私の操作コードは次のとおりです。

// save data
m_pReply = (redisReply *)redisCommand(m_pCntxt, "set %b %b", mykey.data(), mykey.size(), &myval, sizeof(myval));
// del data
m_pReply = (redisReply *)redisCommand(m_pCntxt, "del %b", mykey.data(), mykey.size());

レディス情報:

redis 127.0.0.1:6979> 情報
redis_version:2.4.8
redis_git_sha1:00000000
redis_git_dirty:0
arch_bits:64
multiplexing_api:epoll
gcc_version:4.4.6
プロセス ID:28799
uptime_in_seconds:1289592
uptime_in_days:14
lru_clock:127925
used_cpu_sys:148455.30
used_cpu_user:38023.92
used_cpu_sys_children:23187.60
used_cpu_user_children:123989.72
接続済みクライアント:22
接続されたスレーブ:0
client_longest_output_list:0
client_biggest_input_buf:0
ブロックされた_クライアント:0
used_memory:31903334872
used_memory_human:29.71G
used_memory_rss:34414981120
used_memory_peak:34015653264
used_memory_peak_human:31.68G
mem_fragmentation_ratio:1.08
mem_allocator:jemalloc-2.2.5
読み込み:0
aof_enabled:0
changes_since_last_save:177467
bgsave_in_progress:0
last_save_time:1343456339
bgrewriteaof_in_progress:0
total_connections_received:820
total_commands_processed:2412759064
期限切れのキー:0
evicted_keys:0
keyspace_hits:994257907
keyspace_misses:32760132
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:11672476
vm_enabled:0
役割:スレーブ
マスターホスト:192.168.252.103
マスターポート:6479
master_link_status:アップ
master_last_io_seconds_ago:0
master_sync_in_progress:0
db0: キー = 66372158、期限切れ = 0
4

3 に答える 3

22

次のリンクのメモリ割り当てセクションを参照してください。

http://redis.io/topics/memory-optimization

私はそれをここに引用しました:

キーが削除された場合、Redis は必ずしも OS にメモリを解放 (返却) するとは限りません。これは Redis にとって特別なことではありませんが、ほとんどの malloc() 実装がどのように機能するかです。たとえば、インスタンスに 5GB 相当のデータを格納し、その後 2GB 相当のデータを削除した場合、常駐セット サイズ (プロセスによって消費されるメモリ ページの数である RSS とも呼ばれます) はおそらく依然としてRedis がユーザーメモリが約 3GB であると主張する場合でも、約 5GB です。これは、基になるアロケータがメモリを簡単に解放できないために発生します。たとえば、多くの場合、削除されたキーのほとんどは、まだ存在する他のキーと同じページに割り当てられていました。

于 2014-08-18T18:45:47.993 に答える