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


请输入正文
提交
相关推荐
为什么RDB在做备份时,要先存到一个临时文件去,再转存写入到磁盘中?
回答 1
rdb持久化是通过内存的快照写入,中间通过临时盘,先把数据整合,最终在持久化。我自己考虑的电视,持久化过程中会被从库copy走做其他操作。有可能是从库或人为等等
redis 哪个客户端好用?
回答 3
我是win系统。用的是RedisDesktopManager
两台机器,部署redis,希望高可用,哪个模式比较好?
回答 1
一主一从吧。如果多几台机器的话,考虑cluster
生产上的redis,一般用哪个版本?
回答 1
已采纳
我们使用:5.0
ELT和ETL的区别
回答 2
ETL和ELT在部分模块上是有些区别的,ETL是传统的数据处理方式,按照抽取、转换和加载的顺序进行操作。ELT则是一种更为现代和灵活的数据处理方式。与ETL不同,ELT将重点放在加载阶段,借助目标系统
数据库一个接口查询多次快 还是多个接口分别查询一次快?
回答 1
根据业务决定
redis内存占用
回答 1
已采纳
将Redis中的一个长度为200万的列表拆分为1000个长度为2000的列表,导致内存使用率增加了一半的原因可能如下:内存分配:在原始列表中,Redis会根据元素的大小分配足够的内存空间。当拆分为10
有没有达梦不限制IP的限时license?
回答 1
默认安装的License只限时不限制访问IP,如果你指的是最大连接数,那就必须找达梦申请正式License了。
RPO是什么
回答 2
已采纳
恢复点目标
数据库行级锁定的优缺点?
回答 1
已采纳
行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所能实现的锁定颗粒度最小的锁定机制。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力,