记一次产线打印json导致的redis连接超时

news/2024/11/29 5:37:50/

服务在中午十一点上线后,服务每分钟发出三到四次redis连接超时告警。错误信息为:

Dial err:dial tcp: lookup xxxxx: i/o timeout

排查过程

先是检查redis机器的情况,redis写入并发数较大,缓存中保留了一小时大概400w条数据。redis服务器cpu和内存跟出问题前都差不多,非常接近,看不出什么问题。接下来看看服务的情况。

> LLEN xxxServ:price:change
(integer) 4100314
> ZCARD xxxServ:price:change:zSet
(integer) 963090

业务简单图

业务简单图

服务关键监控指标

  • cpu 从 12%飙升到150%
    cpu

  • 内存平稳,在 150M 上下
    内存

  • goroutines翻倍,从300到600
    goroutines

  • gc时间暴涨,从110us涨到7.5ms
    gc

  • redis 连接数达到了配置的上限20
    redis连接数

  • 文件描述符翻倍了,从100到250
    文件描述符

消息监控

  • 消息消费的qps
    mq-qps

  • 消息平均耗时
    mq耗时

核心接口监控

  • 核心接口qps减半,从200减少到100
    接口qps

  • 接口耗时涨到6倍,从250ms涨到1.5s
    接口耗时

火焰图

火焰图

定位原因

异常的指标有cpu使用率飙升,goroutines翻倍,gc时间暴涨,文件描述符翻倍,核心接口qps减半且耗时暴涨。再看看火焰图,LogToJson函数占用了83%的cpu。

出问题前上线了打印debug日志的代码,产线debug日志默认不会输出,但是debug日志入参是LogToJson的输出,输出的数据为全局的缓存数据,缓存数据比较大,且每次请求都打印一次。

并发数较高,大量打印json导致cpu过高,每次请求后这些大对象要被回收,从而导致gc时间过长,进而导致时不时出现redis io timeout 的错误。取消打印json的debug日志,问题就解决了。

经验教训

大对象不要在并发高场合打印。看到的问题可能只是现象,未必是根本原因,就像这次看起来是redis问题,但实际是打印json的问题。Code Review未必能细致到每个方法,有地方一不小心就踩坑了。


http://www.ppmy.cn/news/61643.html

相关文章

Python进阶篇(五)-- 邮件客户端实现与电子邮件发送

1 SMTP 通过完成本实验,我们将更加了解SMTP协议。还将学到使用Python实现标准协议的经验。 主要任务是开发一个简单的邮件客户端,将邮件发送给任意收件人。客户端将需要连接到邮件服务器,使用SMTP协议与邮件服务器进行对话,并向邮…

SQL Server存储架构(1)——页(Page)、区间(Extent)及分配单位(Allocation Unit)

3. 存储架构 所谓存储架构,这里是指SQL Server数据库磁盘空间组织、管理和使用相关的逻辑设计及实现等方面内容。更具体一点,就是讲SQL Server数据库是如何组织、分配、管理和使用磁盘文件内的存储空间的。本书1.2节中我们已经讲过,SQL Server数据库由多种设计及实现各不相…

SPSS如何进行信度分析之案例实训?

文章目录 0.引言1.信度分析2.多维刻度分析 0.引言 因科研等多场景需要进行数据统计分析,笔者对SPSS进行了学习,本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结,本文对信度分析进行阐述。 1.信度分析 &a…

项目管理:项目进度跟踪的好处有哪些?

项目进度跟踪主要针对项目计划、任务和项目成员三个方面,即为了了解整个项目计划完成情况、了解项目的实际进展情况、解成员工作完成情况。 项目跟踪可以证明计划是否可执行,可以说明计划是否可以被完成。 在项目执行过程中,我们也可以通过跟…

本地部署中文LLaMA模型实战教程,民间羊驼模型

简介 LLaMA大部分是英文语料训练的,讲中文能力很弱。如果我们想微调训练自己的LLM模型,基于一个大规模中文语料预训练的模型比较好。目前开源项目很多,理想的项目要有以下特点: 模型开源、训练代码开源、代码结构简单、环境容易安装、文档清晰。 经过寻找与试验,我找到了…

《Linux0.11源码解读》理解(二) 加载setup、加载system

现在CPU开始执行bootsect,它的作用是挪动bootset并设置栈, 并把第二部分setup、第三部分system程序陆续加载到内存中。把放到合理的内存位置需要先对内存进行规划。 根据上一节,boostsect当前所在内存位置是0x07c0,大小为512byte&#xff0c…

【Cutlass】tile iterator concept

简介 在Cutlass 2.x之前将matix或者tensor切分成固定尺寸的操作都是在tile iterator当中(Cutlass 3.0之后对于matrix和tensor的操作都放到了cute::Tensor里面)。tile_iterator_concept不同于c20里面的concept,这里不使用concept作为key word…

数据结构入门--栈和队列

栈 栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除的一段为栈顶,另一端为栈底。栈中元素遵循后进先出LIFO(Last In First Out)原则。 压栈:栈的插…