暂无图片
如何判断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
打赏 0
暂无图片
test

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

暂无图片 评论
暂无图片 有用 1
打赏 0
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实例的内存容量,或者采用集群、分片等方式分散存储压力。
回答交流
Markdown


请输入正文
提交
相关推荐
怎么根据日志反向查日志来源主机ip?
回答 1
slow中直接看得到IP,真实IP
Android 怎么获取局域网的smb服务器?
回答 1
复杂化:/这里是更好的解决方案:privateclassNetworkUsersextendsAsyncTask{@OverrideprotectedvoidonPreExecute(){//TODO
多实例数据库,启用一个监听,只能启用一个实例,是什么原因?
回答 1
查看下监听端口是否被占用了  
redis 5.0.8 版本 哨兵模式(一主两从),读的数据有时候不一致,一般是怎么处理?
回答 1
是这个情况不:https://code84.com/10809.html
为什么一个公司需要100+的database?以什么原则建立database?
回答 1
为什么一个公司需要100的database?这个完全是伪命题,需要多少个database完全取决与业务量,某公司就一个业务,那一个database就够了。以什么原则建立database?还是根据业务,
redis持久化问题
回答 3
登入redis1、手动执行save,但是会阻塞服务器进程,直到rdb文件创建完成2、用bgsave,它会fork一个子进程来负责创建RDB文件,不会阻塞。
服务器上启动了jenkins 为什么宿主浏览器访问不了啊
回答 1
已采纳
1、检查防火墙是否开启?2、防火墙开启的时候需要加入入网规则;3、如果是Linux系统,查看一下selinux是否开启,如果开启需要关闭。
sdo_util 这个包未编译过 ,但是是加密的, 怎么重建?
回答 1
什么版本? 19.8存在 Bug29286139
改了数据库用户的密码为什么在已经登录的情况下没有掉线, 还能连接?
回答 1
这是因为在建立连接时,用户已经通过了身份验证并获得了访问权限。因此,只要连接保持打开状态,用户可以使用旧密码访问数据库。
redis的pfmerge和pfcount有什么区别?
回答 1
redisHyperLogLog可以接受多个元素作为输入,并给出输入元素的基数估算值.基数:集合中不同元素的数量。比如[foo’,‘bar’,‘foobar’,‘bar’,‘test’}]的基数就是4