您的位置:首页 > 科技 > IT业 > redis内存溢出排查

redis内存溢出排查

2024/9/30 6:28:09 来源:https://blog.csdn.net/litaimin/article/details/141026343  浏览:    关键词:redis内存溢出排查

1、背景
早上收到“系统登录接口异常”、“redis服务器内存利用率过高” ,结合来看怀疑redis导致登录功能异常

2、排查过程
tail -f /var/log/redis/redis-server.log
发现内存溢出报错

29258:M 08 Aug 2024 12:35:00.123 # Warning: memory over the limit
29258:M 08 Aug 2024 12:35:00.123 # Error: memory limit exceeded, write operation denied

redis-cli info memory

used_memory_human:7.7G
maxmemory_human:7.8G

那现在已经是实锤redis溢出了,看下是啥占用了那么多,查看占内存比较高的键

redis-cli --bigkeys

-------- summary -------Sampled 12000000 keys in the keyspace!

redis-cli --bigkeys输出会显示最大占用内存的字符串key、set key、及hash key是啥,分别占了多少字节跟其他信息。但是最大那个key也不过几十M,不可能是某个key造成的,有可能是某种情况引发了百万级别的key创建塞满了redis内存

redis-cli keys “*” > /data/redis-key.log

把所有键名都导出来,发现大部分都是这种“f30a0485-b59f-4939-a41d-3955786b37e0”格式的键名,我恍然大悟,这是创建的会话id啊。

开发反馈会话id过期时间设置了两天,难道会话过期时间设置没生效,导致会话记录一直积在redis里面导致溢出?为了验证我的想法,我得去看下那些现有会话的存活时长有没有超过两天

1、把key的过期时间导出
cat /data/redis-key-100000.log | xargs -I key redis-cli ttl key > /data/key_ttl.log
2、过滤过期时间超过2天的key
cat /data/key_ttl.log | awk '{if($0 > 172800) print $0}'

结果一条都没过滤到,证明过期时间设置没有问题

既然过期时间设置没问题,就看创建出了什么问题,我随便拿了一个会话id的key,打印出它的值

redis-cli get 'f30a0485-b59f-4939-a41d-3955786b37e0'

具体结构就不展示了,但我得到了一个重要信息,这会话里面没有存有会话信息跟业务信息,只存了几个可有可无的值;我纳闷了,会话里不应该存登录信息用户信息啥的吗,为啥用户信息都是空的,这也能创建一个会话啊?证明没有登录就可以创建会话?为了验证我的想法,我去实验了一下:

打开我测试环境的项目,事先清了redis相关记录,我打开页面,没有登录,我立马回去看redis信息,它果真给我创建了一个会话。。。。。我这算是彻底知道咋回事了,肯定有人刷我们的网站,导致会话不断给创建。

后知后觉的我打开的nginx 的访问日志,发现有大量的IP在访问我们的网站

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr

3、解决方案
1) bug修改
经过盘查,发现会话是egg的一个插件egg-seesion-redis自动创建的,只要请求来的没带我们规定的会话key键,而且有数据要写入(不管写入内容是啥,即便为空),就会立马给你创建一个会话,但是这不是我想要的结果,我想要的是登录后再创建会话

2)nginx IP封禁、限制ip每秒访问频率

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com