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哨兵常用命令和监控示例详解
May 27 Redis
浅谈Redis主从复制以及主从复制原理
May 29 Redis
深入理解redis中multi与pipeline
Jun 02 Redis
Windows下redis下载、redis安装及使用教程
Jun 02 Redis
关于redisson缓存序列化几枚大坑说明
Aug 04 Redis
面试分析分布式架构Redis热点key大Value解决方案
Mar 13 Redis
Redis高可用集群redis-cluster详解
Mar 20 Redis
Redis 操作多个数据库的配置的方法实现
Mar 23 Redis
muduo TcpServer模块源码分析
Apr 26 Redis
一文教你快速生成MySQL数据库关系图
Jun 28 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
改德生G88 - 加装等响度低音提升电路
2021/03/02 无线电
php xml 入门学习资料
2011/01/01 PHP
用PHP的超级变量$_GET获取HTML表单(Form) 数据
2011/05/07 PHP
Laravel框架中实现使用阿里云ACE缓存服务
2015/02/10 PHP
php使用Jpgraph绘制3D饼状图的方法
2015/06/10 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
2017/03/19 PHP
基于laravel Request的所有方法详解
2019/09/29 PHP
php实现JWT验证的实例教程
2020/11/26 PHP
jQuery消息提示框插件Tipso
2015/05/04 Javascript
C++中的string类的用法小结
2015/08/07 Javascript
JavaScript事件代理和委托详解
2016/04/08 Javascript
JS实现的按钮点击颜色切换功能示例
2017/10/19 Javascript
Bootstrap实现翻页效果
2017/11/27 Javascript
Angular ng-animate和ng-cookies用法详解
2018/04/18 Javascript
Vue仿支付宝支付功能
2018/05/25 Javascript
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
vue ssr 实现方式(学习笔记)
2019/01/18 Javascript
vue实现的仿淘宝购物车功能详解
2019/01/27 Javascript
vue集成chart.js的实现方法
2019/08/20 Javascript
基于javascript实现贪吃蛇小游戏
2019/11/25 Javascript
在vue中实现某一些路由页面隐藏导航栏的功能操作
2020/09/21 Javascript
使用Typescript开发微信小程序的步骤详解
2021/01/12 Javascript
[01:02:54]完美世界DOTA2联赛PWL S2 FTD vs GXR 第一场 11.22
2020/11/26 DOTA
python根据开头和结尾字符串获取中间字符串的方法
2015/03/26 Python
python+opencv轮廓检测代码解析
2018/01/05 Python
使用Python和Prometheus跟踪天气的使用方法
2019/05/06 Python
树莓派+摄像头实现对移动物体的检测
2019/06/22 Python
python分布式计算dispy的使用详解
2019/12/22 Python
matplotlib教程——强大的python作图工具库
2020/10/15 Python
python 装饰器的基本使用
2021/01/13 Python
澳大利亚男士西服品牌:M.J.Bale
2018/02/06 全球购物
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
Collection和Collections的区别
2016/05/02 面试题
国庆促销活动总结
2014/08/29 职场文书
教师节大会主持词
2015/07/06 职场文书
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python