线上redis bgsave导致服务响应延迟

摘要:
因为我们的服务很依赖redis,且对redis进行过一次降配,于是redis的性能:可以看到在出问题的时间段redis的延迟也达到s级别。memory:可以看到内存使用率已经达到90%以上,所以很明显redis内存存在问题,为了尽快解决线上问题,先进行redis内存的升级,再去寻找内在具体原因。我觉得通过一点可以印证这一点,从00点到08点之间,其实redis内存的使用率一直很高,但是在这段时间用户的请求量较少,所以redis的写请求不多,也就不会导致bgsave因内存不足而发生报错。

最近一个服务上线一个月后出现某个时间段响应延迟的问题,先看下监控数据:

线上redis bgsave导致服务响应延迟第1张

这里有一点,单台实例的并发最高达到200是因为没修改spring boot中tomcat默认的最大线程数(默认是200)。

从上图可以看出21点—24点以及第二天08点—11点服务的延迟已经达到s级别,甚至严重时已经达到30多s,整个app基本不可用。

问题第一次出现时,整个服务启了4台实例,dau是40万,所以当时单纯怀疑是因为访问量增加导致实例的请求线程被打满,出现请求阻塞导致的延迟。于是在24点时将服务增加到8台实例,响应出现好转。

但是第二天又出现类似情况,且更加严重,每台实例的qps只有500左右,所以分析是其他问题导致的请求耗时较高从而引起的请求阻塞。因为我们的服务很依赖redis,且对redis进行过一次降配(这个服务属于突然起量),于是redis的性能:

线上redis bgsave导致服务响应延迟第2张

可以看到在出问题的时间段redis的延迟也达到s级别。于是查看redis的内存和cpu状态:

CPU load:

线上redis bgsave导致服务响应延迟第3张

可以看到redis实例出现cpu load达到1以上,说明CPU阻塞严重,大量的处理请求在排队。

memory:

线上redis bgsave导致服务响应延迟第4张

可以看到内存使用率已经达到90%以上,所以很明显redis内存存在问题,为了尽快解决线上问题,先进行redis内存的升级(使用的阿里服务,升级耗时3分钟),再去寻找内在具体原因。

进入redis集群,通过info查看redis状态:果然发现异常,rdb_last_bgsave_status:err

线上redis bgsave导致服务响应延迟第5张

redis bgsave失败,使用的RDB持久化策略,bgsave会fork一个进程进行数据的持久化,具体的分析可以参考这篇文章,讲的很详细:https://zhuanlan.zhihu.com/p/89248752

通过以上分析,个人认为这次问题的具体原因是:

1、fork子进程会消耗CPU资源,通过下图可以看出,CPU随着定时执行的bgsave出现锯齿状波动

线上redis bgsave导致服务响应延迟第6张

2、fork出的子进程和父进程会共享堆栈代码和内存,只有当父进程进行数据修改二者才会分离,所以出现这次问题的本质原因是因为内存使用率过高,而且redis的写请求量很大,所以导致bgsave时内存不足而发生错误,出现错误又会重新fork子进程去重新执行数据同步,所以导致CPU负载一直较高无法处理其他请求,从而hang住了整个客户端。

我觉得通过一点可以印证这一点,从00点到08点之间,其实redis内存的使用率一直很高,但是在这段时间用户的请求量较少,所以redis的写请求不多,也就不会导致bgsave因内存不足而发生报错。

免责声明:文章转载自《线上redis bgsave导致服务响应延迟》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Delphi子窗体随主窗体大小而变化go笔记-限速器(limiter)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

window安装redis无法启动报错

windows下安装Redis第一次启动报错: Creating Server TCP listening socket 127.0.0.1:6379: bind: No error 解决方法:在命令行中运行 1 在服务里, 将redis停掉重启就行 2 可以具体进行如下操作 redis-cli.exe 127.0.0.1:6379>shutdown...

Docker Swarm 服务编排之命令

一、简介   Docker有个编排工具docker-compose,可以将组成某个应该的多个docker容器编排在一起,同时管理。同样在Swarm集群中,可以使用docker stack 将一组相关联的服务进行编排管理。   Docker stack 也是一个yaml文件,和一份docker-compose.yml文件差不多,指令也基本一致。但是与comp...

2019 2345网址导航java面试笔试题 (含面试题解析)

  本人5年开发经验、18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴、今日头条、2345网址导航等公司offer,岗位是Java后端开发,因为发展原因最终选择去了2345网址导航,入职一年时间了,也成为了面试官,之前面试了很多家公司,感觉大部分公司考察的点都差不多,趁空闲时间,将自己的心得记下来,希望能给正在找或者准备找工作的朋友提供一点帮助。...

python服务器环境搭建——安装相关软件

在上一篇我们在本地的虚拟服务器上安装好CentOS7后,我们的python web服务、自定义的python service或python脚本需要在服务器上运行,还需要在服务器安装各种相关的软件才行,一般来说,想要实现自动化部署需求,还需要安装nginx、svn、uwsgi、python3.0(系统自带python2.7.5)、supervisor、pos...

[redis] redis在线系统热迁移的方案与记录

一 前言 如图,是我的环境。 这里边有三个系统,1 业务系统。2 redis cluster集群。3 redis cluster集群的管理系统。 系统1,会对redis中进行秒级的数据添加,读取,删除操作。系统3,是redis集群的增加节点减少节点,节点failover功能进行管理。 如图目前,我的系统里,redis共占用了a1,b1,c1,d1四台物理设...

spring-session之二:简单配置

官方示例:https://docs.spring.io/spring-session/docs/current/reference/html5/#samples 配置Spring Session 在Web项目中配置Spring Session分为四步: 搭建用于Spring Session的数据存储 将Spring Session的jar文件添加到...