2012-07-28 11 views
11

Redisはデータを保存するのに使用されますが、多くのメモリとそのメモリ使用量は最大52.5%です。 私はredisでキーの半分を削除しました。そして、削除操作の戻りコードはokですが、そのメモリ使用量は減少しません。なぜキーの半分が半分になっても、赤のメモリ使用量は減少しない

何故ですか?前もって感謝します。

マイオペレーションコードは以下の通りです:

// 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の情報:

 
redis 127.0.0.1:6979> info 
redis_version:2.4.8 
redis_git_sha1:00000000 
redis_git_dirty:0 
arch_bits:64 
multiplexing_api:epoll 
gcc_version:4.4.6 
process_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 
connected_clients:22 
connected_slaves:0 
client_longest_output_list:0 
client_biggest_input_buf:0 
blocked_clients: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 
loading: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 
expired_keys:0 
evicted_keys:0 
keyspace_hits:994257907 
keyspace_misses:32760132 
pubsub_channels:0 
pubsub_patterns:0 
latest_fork_usec:11672476 
vm_enabled:0 
role:slave 
master_host:192.168.252.103 
master_port:6479 
master_link_status:up 
master_last_io_seconds_ago:0 
master_sync_in_progress:0 
db0:keys=66372158,expires=0 
+1

残念ながら、redis-serverプロセスを再起動する必要があります。 http://stackoverflow.com/a/5994981/1089294 – underley

+0

システムが動作していますが、再起動できません。たぶんあなたは正しい、redis delキーは本当に無料のmallocではない。 – hupantingxue

答えて

11

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

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

Iそれを引用しました:

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

+0

ありがとうございます。だから、ここでの「解決策」は赤字の再開ですか? –

+1

@stevejalim、私はそうだと思いますが、割り当てられたメモリを解放する設定可能な方法があるかどうかはわかりません。 –

+0

@SteveJalim設定が常に作成され、削除されたキーがたくさんある場合は、jemallocなどの断片化回避機能が優れたメモリアロケータを使用するredisビルドをコンパイルすることをお勧めします。既に割り当てられているメモリは解放されませんが、メモリ使用量をさらに減らすのに役立ちます。 –

関連する問題