今天刚收到一个应用tomcat内存溢出,分析dump之后发现单个线程并没有消耗的多的,大概有100个线程,消耗内存在30M-60M之间。
继续分析,发现这些线程在操作redis,set和get 一个key,这个key里面存放的是用户积分的信息,不过这个key比较大,有35M。
从tomcat server日志里面可以看到获取不到数据库连接的错误,数据库连接池配置的是100个连接。
这里要搞清楚为什么有这么多的操作redis的线程,是因为操作redis太慢导致。可能有同学会问,操作redis不是很快吗,毫秒级别,1万个并发,多线程等等。其实是知其然不知其所以然,redis在key很小的时候很快,当big key的时候,会变得很慢。即便是redis 6.0 ,在操作命令时都是单线程,网络IO和写AOF文件是多线程的,当一个get或set操作慢的时候,会堵塞后续的命令。就出现了现在的事故。
本次内存溢出重启tomcat是没有用的,因为redis里面的big key还在,所以临时的解决方案是删除redis中的big key。治本的方法是优化程序,不产生big key 。
redis使用不当导致系统的宕机
最新推荐文章于 2024-07-15 17:17:07 发布