当前位置: 首页 > article >正文

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

服务在中午十一点上线后,服务每分钟发出三到四次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.kler.cn/news/17792.html

相关文章:

  • 【算法】Check If Word Is Valid After Substitutions 检查替换后的词是否有效
  • MySQL高频面试题
  • 多通道振弦传感器无线采集仪通过短信和FTP文件修改参数
  • 设计原则之【接口隔离原则】
  • 22.Java多线程
  • SpreadJS 16.1 EN + SpreadJS 16.1 CN Crack
  • 【Linux】linux进程间通信netlink socket(用户与内核通信)
  • PBDB Data Service:Special parameters(特殊参数)
  • 公司新来的00后真是卷王,工作没2年,跳槽到我们公司起薪18K都快接近我了
  • JAVA原生语言开发多学校Saas模式校园管理系统
  • LT8471IFE#PBF-ASEMI代理亚德诺LT8471IFE#PBF原厂芯片
  • 文件操作和IO
  • 机器视觉工程师,听我一句劝,别去外包,干了三年,废了....对女人没了兴趣
  • 【Unity编辑器】拓展Project视图
  • 复兴号列车司机室
  • Midjourney之logo设计(建议收藏)
  • 杂乱之Android的字体相关类Typeface
  • 一道2023年数学分析真题
  • 【Linux】Linux安装Nexus(图文解说详细版)
  • 基于numpy的鸢尾花数据获取、处理等操作。
  • Android14新权限机制
  • 2023-05-04 LeetCode每日一题(摘水果)
  • 行为型模式-解释器模式
  • 了解进程控制
  • 错题汇总03
  • 顺序表和链表优缺点以及区别
  • MySQL索引
  • 涨薪60%,从小厂逆袭,坐上美团技术专家(面经+心得)
  • Java——和为S的连续正数序列
  • 【C++】机房预约系统