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 14 Redis
详解Redis实现限流的三种方式
Apr 27 Redis
详解缓存穿透击穿雪崩解决方案
May 28 Redis
Windows中Redis安装配置流程并实现远程访问功能
Jun 07 Redis
了解Redis常见应用场景
Jun 23 Redis
在redisCluster中模糊获取key方式
Jul 09 Redis
浅谈Redis位图(Bitmap)及Redis二进制中的问题
Jul 15 Redis
redis的list数据类型相关命令介绍及使用
Jan 18 Redis
聊聊redis-dump工具安装问题
Jan 18 Redis
Redis监控工具RedisInsight安装与使用
Mar 21 Redis
一文搞懂Redis中String数据类型
Apr 03 Redis
Redis基本数据类型Set常用操作命令
Jun 01 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
在数据量大(超过10万)的情况下
2007/01/15 PHP
PHP编程计算日期间隔天数的方法
2017/04/26 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
Jquery增加鼠标中间功能mousewheel的实例代码
2013/09/05 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
JavaScript中的全局对象介绍
2015/01/01 Javascript
javascript特殊文本输入框网页特效
2016/09/13 Javascript
JS创建对象的写法示例
2016/11/04 Javascript
js实现的在线调色板功能完整实例
2016/12/21 Javascript
Ionic3 UI组件之autocomplete详解
2017/06/08 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
Angular中使用MathJax遇到的一些问题
2017/12/15 Javascript
详解VUE 数组更新
2017/12/16 Javascript
JavaScript深入V8引擎以及编写优化代码的5个技巧
2019/06/24 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
[02:57]DOTA2亚洲邀请赛小组赛第四日 赛事回顾
2015/02/02 DOTA
Python实现通过继承覆盖方法示例
2018/07/02 Python
Flask框架Jinjia模板常用语法总结
2018/07/19 Python
matplotlib调整子图间距,调整整体空白的方法
2018/08/03 Python
python解析含有重复key的json方法
2019/01/22 Python
python使用requests.session模拟登录
2019/08/09 Python
python 队列基本定义与使用方法【初始化、赋值、判断等】
2019/10/24 Python
python flask搭建web应用教程
2019/11/19 Python
浅谈pytorch torch.backends.cudnn设置作用
2020/02/20 Python
matplotlib.pyplot.matshow 矩阵可视化实例
2020/06/16 Python
8种常用的Python工具
2020/08/05 Python
详解Python 函数参数的拆解
2020/09/02 Python
HTML5标签使用方法详解
2015/11/27 HTML / CSS
AmazeUI折叠式卡片布局,整合内容列表、表格组件实现
2020/08/20 HTML / CSS
惠普加拿大在线商店:HP加拿大
2017/09/15 全球购物
美国最大的在线水培用品商店:GrowersHouse.com
2018/08/14 全球购物
《天游峰的扫路人》教学反思
2014/04/25 职场文书
商铺租房协议书范本
2014/12/04 职场文书
酒店优秀员工推荐信
2015/03/24 职场文书
Python图片处理之图片裁剪教程
2021/05/27 Python