暂无图片
如何判断redis是否还有内存可以申请使用
我来答
分享
test
2024-01-22
如何判断redis是否还有内存可以申请使用

服务器总内存128g,三个redis设置最大内存均为40g,下列为数据库内存使用情况。

used_memory:38915698408
used_memory_human:36.24G
used_memory_rss:39606910976
used_memory_rss_human:36.89G
used_memory_peak:40872855792
used_memory_peak_human:38.07G
used_memory_peak_perc:95.21%
used_memory_overhead:3843316
used_memory_startup:1183608
used_memory_dataset:38911855092
used_memory_dataset_perc:99.99%
allocator_allocated:38915885416
allocator_active:38917550080
allocator_resident:39612149760
total_system_memory:135009652736
total_system_memory_human:125.74G

服务器内存为

            total used free shared buffers cached
Mem: 129044 124961 4083 1 94 286
-/+ buffers/cache: 124580 4464
Swap: 7023 2799 4224

top 查看内存使用情况

                             VIRT  RES

63547 redis 20 0 44.9g 40g 900 S 11.0 31.9 145:21.07 redis-server
63540 redis 20 0 44.9g 40g 900 S 11.7 31.9 139:15.38 redis-server
63535 redis 20 0 44.9g 39g 908 S 10.3 31.6 156:52.98 redis-server


问题1:为什么top中virt 部分(申请的内存大小)超过了40g?

问题2:为什么info memory中的use_memory与top中实际使用的内存大小不同

问题3:如何判断内存什么时候被使用完?是used_memeory达到40g,或是其他方法判断

请大佬指点下

我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新
shunwahⓂ️

问题1:在Linux系统中,VIRT代表进程虚拟内存空间的总量,它包括了进程本身占用的内存加上其子进程占用的内存,还包括了映射但未实际分配的内存。Redis在启动时会预分配一部分内存用于存储数据,同时还会有一些内存映射操作,所以VIRT部分的内存大小可能会超过配置的最大内存限制(40GB)。实际上,Redis会受到maxmemory参数的限制,不会无限制地增长至VIRT所显示的大小。

问题2:used_memory 是Redis内部管理的数据结构实际占用的内存大小,而RES(常被称为RSS,Resident Set Size)则是操作系统视角下,Redis进程实际使用的物理内存大小,其中包括了Redis自身占用的内存和OS为其分配的内核缓冲区等。两者之间的差异主要在于是否包含了内存碎片、共享库、内存映射区域等因素。

问题3:判断Redis内存是否即将耗尽,主要是监控used_memory字段。当used_memory接近或等于你在Redis配置文件中设置的maxmemory值时,说明Redis已接近内存上限。当达到maxmemory时,如果没有配置相应的内存淘汰策略(如LRU、volatile-lru等),Redis将不再接收新的写入请求,直到有键过期或被删除释放出内存空间。因此,运维人员应该密切关注Redis的内存使用情况,并提前规划好内存淘汰策略以防止内存溢出。

暂无图片 评论
暂无图片 有用 1
暂无图片
test

后续数据持续进入,但是used_memory_human最终持续在37.55g上下徘徊

暂无图片 评论
暂无图片 有用 1
test
题主
2024-01-22
used_memory_peak_human 最高为40.01g,超过了maxmemory设置的40g
shunwahⓂ️
2024-01-25
看起来Redis在某一时刻确实超过了设定的maxmemory值(40GB),这可能是因为Redis在内存回收和新数据插入之间存在一个时间差。当Redis内存使用量到达maxmemory后,如果没有配置内存淘汰策略,Redis将停止接收新写入的数据,直到有键被删除或过期释放内存。 然而,由于你提到used_memory_human最后稳定在37.55GB左右,这意味着Redis内部可能存在某种机制使得内存使用量没有持续超过40GB。可能是Redis执行了某种内存淘汰策略(比如设置了maxmemory-policy),或者在内存峰值之后进行了某些键值的更新或删除操作,从而释放了内存。 为了确保Redis正常运行并且不会因为内存超出限制而导致服务异常,你应该做如下检查和操作: 确认Redis实例的maxmemory设置是否正确无误。 确认并设置合理的内存淘汰策略(如LRU、TTL、volatile-lru等),以便在内存满载时能自动删除较少使用的数据腾出空间。 定期监控Redis的内存使用情况,包括used_memory和used_memory_peak等指标,确保其不超过maxmemory设置的值。 对于大量数据持续写入的情况,考虑增加Redis实例的内存容量,或者采用集群、分片等方式分散存储压力。
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏