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 12 Redis
深入理解redis中multi与pipeline
Jun 02 Redis
Redis 常见使用场景
Aug 30 Redis
Redis中缓存穿透/击穿/雪崩问题和解决方法
Dec 04 Redis
聊聊redis-dump工具安装问题
Jan 18 Redis
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
Mar 16 Redis
Redis高可用集群redis-cluster详解
Mar 20 Redis
redis sentinel监控高可用集群实现的配置步骤
Apr 01 Redis
关于Redis的主从复制及哨兵问题
Jun 16 Redis
使用Redis实现分布式锁的方法
Jun 16 Redis
浅谈Redis变慢的原因及排查方法
Jun 21 Redis
Redis唯一ID生成器的实现
Jul 07 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
php 中的4种标记风格介绍
2012/05/10 PHP
php提交表单发送邮件的方法
2015/03/20 PHP
深入讲解PHP Session及如何保持其不过期的方法
2015/08/18 PHP
POST一个JSON格式的数据给Restful服务实例详解
2017/04/07 PHP
Laravel 队列使用的实现
2019/01/08 PHP
JavaScript获得选中文本内容的方法
2008/12/02 Javascript
javascript 操作cookies及正确使用cookies的属性
2009/10/15 Javascript
Node.js读取文件内容示例
2017/03/07 Javascript
Angular.js中上传指令ng-upload的基本使用教程
2017/07/30 Javascript
Ionic3实现图片瀑布流布局
2017/08/09 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
2018/09/04 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
2018/12/24 Javascript
node.js中ws模块创建服务端和客户端,网页WebSocket客户端
2019/03/06 Javascript
基于JavaScript 实现拖放功能
2019/09/12 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
微信小程序实现多行文字滚动
2020/11/18 Javascript
python判断端口是否打开的实现代码
2013/02/10 Python
详解Python中for循环的使用方法
2015/05/14 Python
python使用reportlab实现图片转换成pdf的方法
2015/05/22 Python
Python的collections模块中的OrderedDict有序字典
2016/07/07 Python
Python字符编码与函数的基本使用方法
2017/09/30 Python
Python装饰器(decorator)定义与用法详解
2018/02/09 Python
python实现下载pop3邮件保存到本地
2018/06/19 Python
python3的url编码和解码,自定义gbk、utf-8的例子
2019/08/22 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
python内置模块collections知识点总结
2019/12/19 Python
python读取Kafka实例
2019/12/23 Python
一文详述 Python 中的 property 语法
2020/09/01 Python
一款css实现的鼠标经过按钮的特效
2014/09/11 HTML / CSS
匡威荷兰官方网站:Converse荷兰
2018/10/24 全球购物
银行求职推荐信范文
2013/11/30 职场文书
安全资料员岗位职责
2013/12/14 职场文书
期中考试反思800字
2014/05/01 职场文书
迎新年主持词
2015/07/06 职场文书
《索溪峪的野》教学反思
2016/02/19 职场文书
如何理解python接口自动化之logging日志模块
2021/06/15 Python