2012-07-28 32 views
11

Redis được sử dụng để lưu dữ liệu nhưng chi phí rất nhiều bộ nhớ và mức sử dụng bộ nhớ của nó lên đến 52.5%. Tôi đã xóa một nửa số khóa bằng chữ đỏ và mã trả lại của thao tác xóa là ok, nhưng việc sử dụng bộ nhớ của nó không giảm.Tại sao việc sử dụng bộ nhớ redis không giảm khi một nửa số phím

Lý do là gì? Cảm ơn trước.

đang hoạt động của tôi là như sau:

// 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()); 

Thông báo thông tin 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

Rất tiếc, bạn phải khởi động lại quá trình redis-server. Xem http://stackoverflow.com/a/5994981/1089294 – underley

+0

Hệ thống hiện đang chạy, tôi không thể khởi động lại. Có lẽ bạn là đúng, redis del key không thực sự miễn phí malloc. – hupantingxue

Trả lời

11

Vui lòng tham khảo phần phân bổ bộ nhớ vào liên kết sau:

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

tôi trích dẫn tại đây:

Redis sẽ không luôn luôn giải phóng bộ nhớ (trở lại) cho hệ điều hành khi các phím bị xóa . Đây không phải là một cái gì đó đặc biệt về Redis, nhưng nó là cách triển khai thực hiện nhất malloc(). Ví dụ: nếu bạn điền vào một ví dụ với 5GB giá trị dữ liệu và sau đó loại bỏ tương đương 2GB dữ liệu, Kích thước bộ thường trú (còn được gọi là RSS, là số trang bộ nhớ mà quá trình tiêu thụ) có lẽ vẫn còn khoảng 5GB, ngay cả khi Redis sẽ xác nhận rằng bộ nhớ người dùng là khoảng 3GB. Điều này xảy ra vì người cấp phát cơ bản không thể dễ dàng giải phóng bộ nhớ . Ví dụ thường thì hầu hết các khóa đã xóa được phân bổ trong các trang giống như các phím khác vẫn còn tồn tại.

+0

Cảm ơn vì điều này. Vì vậy, là 'giải pháp' ở đây một khởi động lại cứng của redis? –

+1

@stevejalim, tôi nghĩ như vậy, nhưng tôi không chắc chắn nếu có bất kỳ cách nào có thể cấu hình để giải phóng bộ nhớ được cấp phát. –

+0

@SteveJalim Nếu bạn thấy thiết lập của mình luôn có nhiều khóa được tạo và xóa, tôi đề xuất biên dịch một bản dựng lại có sử dụng bộ cấp phát bộ nhớ có khả năng tránh phân mảnh tốt hơn như jemalloc. Nó sẽ không giải phóng bộ nhớ đã được cấp phát nhưng nó sẽ giúp giảm thiểu việc sử dụng bộ nhớ. –

Các vấn đề liên quan