redis 限制内存使用大小的实现


Posted in Redis onMay 08, 2021

记录一次生产环境问题排查过程:

生产环境部署方式:nginx + uwsgi + flask

问题描述:

发现生产环境中之前正常运行的服务突然不可用了,查看程序日志发现部分接口访问时报I/O写错误,nginx acess.log显示504,error.log显示 upstream time out.
同时 netstat -apn | grep 6379 | wc -l 检查发现redis存在大量连接,进一步检查发现其中大多为 SYN_SENT 包,连接大多归属于uwsgi 进程。

  因为程序中有很多接口被调用是会访问redis, 以为是redis连接池导致,对程序中的redis连接池进行优化后重启服务,刚启动时一切正常,http 200, 但几分钟后服务再次挂掉,http 504.

检查系统资源使用情况,发现 kswapd0 进程CPU占用很高,这个进程是当物理内存不足时,会将一部分硬盘当做虚拟内存来使用, 使用swap分区与内存换页操作交换数据,导致CPU占用过高, 再细看发现redis-server内存占用已超过100%:

redis 限制内存使用大小的实现

进入redis中查看info memory和各存储数据的key下数据量,果然存在大量未处理完毕的数据。

到此问题终于是找到了。

设置redis最大占用内存

# 编辑redis配置文件,加入最大内存使用限制,我根据服务器的情况设置为3G
maxmemory 3221225472

设置redis数据过期策略:

redis中有6种过期策略:

# 根据LRU算法生成的过期时间来删除
# volatile-lru -> remove the key with an expire set using an LRU algorithm
# 根据LRU算法删除任何key。
# allkeys-lru -> remove any key accordingly to the LRU algorithm
# 根据过期设置来随机删除key。
# volatile-random -> remove a random key with an expire set
# 无差别随机删。
# allkeys-random -> remove a random key, any key
# 根据最近过期时间来删除(辅以TTL)
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# 谁也不删,直接在写操作时返回错误。
# noeviction -> don't expire at all, just return an error on write operations

在redis配置文件中设置过期策略为:maxmemory-policy allkeys-lru

  一开始是设置为volatile-lru的,但是该策略只是清除设置过期时间的key值,因为很多key并没有设置过期时间。因此修改为maxmemory-policy allkeys-lru,指明非活跃近期很少用的key值清除.

  在使用maxmemory-policy allkeys-lru策略时,内存超限后将不再存储数据,但数据的读取删除操作不会受影响,超限时显示错误

OOM command not allowed when used memory > 'maxmemory'

redis 限制内存使用大小的实现

重启程序,至此服务终于正常运行。

总结:本次的问题归根结底是redis中存储入了大量脏数据,但数据处理并没有及时的清理掉这部分数据,最终导致服务停滞,allkeys-lru策略有可能会将长期未用但实际有用的数据清理掉,所以还是应优化数据处理为主。

到此这篇关于redis 限制内存使用大小的实现的文章就介绍到这了,更多相关redis 限制内存内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
Redis持久化与主从复制的实践
Apr 27 Redis
SpringBoot 集成Redis 过程
Jun 02 Redis
解析Redis Cluster原理
Jun 21 Redis
聊一聊Redis与MySQL双写一致性如何保证
Jun 26 Redis
Redis性能监控的实现
Jul 09 Redis
使用redis实现延迟通知功能(Redis过期键通知)
Sep 04 Redis
在项目中使用redis做缓存的一些思路
Sep 14 Redis
浅谈Redis的keys命令到底有多慢
Oct 05 Redis
浅谈Redis 中的过期删除策略和内存淘汰机制
Apr 03 Redis
解决 Redis 秒杀超卖场景的高并发
Apr 12 Redis
使用Redis实现分布式锁的方法
Jun 16 Redis
Redis配置外网可访问(redis远程连接不上)的方法
Dec 24 Redis
使用Redis实现秒杀功能的简单方法
Redis6.0搭建集群Redis-cluster的方法
May 08 #Redis
浅谈Redis存储数据类型及存取值方法
Redis IP地址的绑定的实现
May 08 #Redis
redis通过6379端口无法连接服务器(redis-server.exe闪退)
redis 查看所有的key方式
Redis5之后版本的高可用集群搭建的实现
You might like
第五节--克隆
2006/11/16 PHP
php获取CSS文件中图片地址并下载到本地的方法
2014/12/02 PHP
Session 失效的原因汇总及解决丢失办法
2015/09/30 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
javascript写的简单的计算器,内容很多,方法实用,推荐
2011/12/29 Javascript
Ajax执行顺序流程及回调问题分析
2012/12/10 Javascript
javascript中利用柯里化函数实现bind方法【推荐】
2016/04/29 Javascript
JavaScript的模块化开发框架Sea.js上手指南
2016/05/12 Javascript
微信小程序 video组件详解
2016/10/25 Javascript
JavaScript实现Fly Bird小游戏
2016/12/15 Javascript
基于vue2.0+vuex+localStorage开发的本地记事本示例
2017/02/28 Javascript
js实现年月日表单三级联动
2020/04/17 Javascript
NodeJs安装npm包一直失败的解决方法
2017/04/28 NodeJs
echarts学习笔记之图表自适应问题详解
2017/11/22 Javascript
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
vuex刷新后数据丢失的解决方法
2020/10/18 Javascript
[44:40]Serenity vs Pain 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python根据日期返回星期几的方法
2015/07/06 Python
python生成IP段的方法
2015/07/07 Python
Django框架下在视图中使用模版的方法
2015/07/16 Python
python创建列表并给列表赋初始值的方法
2015/07/28 Python
Python中read()、readline()和readlines()三者间的区别和用法
2017/07/30 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
2019/06/17 Python
HTML 5 标签、属性、事件及浏览器兼容性速查表 附打包下载
2012/10/20 HTML / CSS
美国领先的汽车轮胎和轮毂供应商:TireBuyer
2016/07/21 全球购物
VIVOBAREFOOT赤脚鞋:让您的脚做自然的事情
2017/06/01 全球购物
外企财务年会演讲稿
2014/01/03 职场文书
社区安全检查制度
2014/02/03 职场文书
关于环保的演讲稿
2014/05/10 职场文书
环保倡议书400字
2014/05/15 职场文书
美术专业自荐信
2014/07/07 职场文书
义务教育学校标准化建设汇报材料
2014/08/16 职场文书
先进基层党组织事迹材料
2014/12/25 职场文书
2015年行政助理工作总结
2015/04/30 职场文书
幼儿园教师辞职信
2019/06/21 职场文书
导游词之河姆渡遗址博物馆
2019/10/10 职场文书