从昨天开始,我们的Redis服务器逐渐(每小时200MB)使用更多的内存,而密钥(330K)及其数据量(132MB redis-rdb- tools)则保持不变。
redis-cli info的输出显示6.89G已用内存?
redis_version:2.4.10 redis_git_sha1:00000000 redis_git_dirty:0 arch_bits:64 multiplexing_api:epoll gcc_version:4.4.6 process_id:3437 uptime_in_seconds:296453 uptime_in_days:3 lru_clock:1905188 used_cpu_sys:8605.03 used_cpu_user:1480.46 used_cpu_sys_children:1035.93 used_cpu_user_children:3504.93 connected_clients:404 connected_slaves:0 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 used_memory:7400076728 used_memory_human:6.89G used_memory_rss:7186984960 used_memory_peak:7427443856 used_memory_peak_human:6.92G mem_fragmentation_ratio:0.97 mem_allocator:jemalloc-2.2.5 loading:0 aof_enabled:0 changes_since_last_save:1672 bgsave_in_progress:0 last_save_time:1403172198 bgrewriteaof_in_progress:0 total_connections_received:3616 total_commands_processed:127741023 expired_keys:0 evicted_keys:0 keyspace_hits:18817574 keyspace_misses:8285349 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:1619791 vm_enabled:0 role:slave master_host:***BLOCKED*** master_port:6379 master_link_status:up master_last_io_seconds_ago:0 master_sync_in_progress:0 db0:keys=372995,expires=372995 db6:keys=68399,expires=68399
当我们将(.net)客户端代码从BookSleeve 1.1.0.4更新到ServiceStack v3.9.71以准备升级到Redis 2.8时,问题就开始了。但是许多其他内容已更新为,并且我们的会话状态存储(也有Redis,但带有Harbor客户端)没有显示相同的症状。
Redis的所有内存都在哪里?如何解决其使用问题?
编辑:我刚刚重新启动此实例,内存返回到350M,现在又在爬。前10个最大的对象仍保持相同的大小,对于nr 1,范围从100K到25M。密钥数量已降至270K(之前为330K)。
以下是Redis中“隐藏”内存消耗的一些来源:
Marc已经提到了主机维护供从机使用的缓冲区。如果从属服务器落后于其主服务器(例如,因为它在较慢的机器上运行),则将在主服务器上消耗一些内存。
当检测到长时间运行的命令时,Redis将它们记录在SLOWLOG区域中,这会占用一些内存。您可能要使用SLOWLOG LEN命令来检查此处的记录数。
通信缓冲区也可以占用内存。据我所记得,在Redis的旧版本(2.4已经很旧了-您应该真正升级)中,它是不受限制的,这意味着如果您在某个点上传输一个大对象,则与此客户端连接相关联的通信缓冲区将会增加永不缩水。如果有许多客户偶尔处理大型物体,则可能是一种解释。如果您使用命令从Redis中检索非常大的数据(一次完成),这也可能是一种解释。例如,在Redis服务器上应用简单的KEYS *命令来存储数百万个密钥,将会消耗大量内存。
您提到您有多达25 MB的对象。您有404个客户端连接,如果每个客户端连接都需要在某个时间点访问此类对象,则会消耗10 GB的内存。