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

记一次CPU有规律飙高的线上问题排查过程

一、背景

最近在计费系统模块和灰度发布相关的功能已经基本交付,在这个间隙中,领导说有个线上问题需要排查下,
问题的场景比较有意思,排查过程中也有一些成长,这里记录一下。

二、排查过程

2.1 查看pinpoint 监控

首先根据领导的反馈看pinpoint中的JVM的CPU日志:
image.png
CPU每隔一个小时会有一个突刺,对于平时的表现来看有个波峰。而且通过不同时段的波峰的表现看是相对有规律的,同时波峰的持续时间也是不太固定的,有时候是2-4分钟,有时候是将近10分钟,另外发生波峰的时间点大多在每个小时的前10分钟左右,如下监控显示:
image.png

2.2 排除FGC的影响

因为最近上线该服务的时候我们修改了JVM的启动参数,领导说可以明确没有GC,这里我也看了JVM的启动参数:
image.png
另外就是堆内存和非堆内存的监控也没有明确有GC的影子,所以这里先排除FGC的影响。另外一方面如果出现CPU利用率飙高的情况下之前遇到的都是接近百分之百,目前基本是75%左右。

2.3 查看ELK日志-SQL部分

这里先看一下该服务在处于CPU飙高的时间段内SQL方面的监控日志:
image.png
排查如下日志:

[cn.xxx.dao.xxMapper.selectByxxxIdAndRound]-[debug]:<== Total: 1

这里主要看SQL内容和Total字段返回的条数,但是基本上没有发现问题,可以排除是SQL 方面的原因了。

2.4 查看缓存代码

由于之前做过分布式本地缓存刷新的方案和落地,所以就敏感的去查一下本地缓存方面的代码,因为有个关键点是本地缓存用Guava构建的,同时注释说明是每个小时构建一次,这里我们看一下构建代码:

CacheLoader<String, Map<String, Object>> loader =new CacheLoader<String, Map<String, Object>>() {@Overridepublic Map<String, Object> load(String key) throws Exception {return loadInfo(key);}@Overridepublic ListenableFuture<Map<String, Object>> reload(final String key, Map<String, Object> voiceSiteInfo) {ListenableFutureTask<Map<String, Object>> task =ListenableFutureTask.create(new 

相关文章:

  • JAVA面试汇总总结更新中ing
  • 【AI数字人-论文】Geneface论文
  • 【芯片设计- RTL 数字逻辑设计入门 6 -- 带同步复位的D触发器 RTL实现及testbench 验证】
  • JAVA中的main方法
  • 【方法论】费曼学习方法
  • 【Spring Boot 3】【JPA】嵌入式对象
  • 文心一言4.0API接入指南
  • 2024Node.js零基础教程(小白友好型),nodejs新手到高手,(五)NodeJS入门——http模块
  • C# OpenCvSharp DNN 部署yolov4目标检测
  • Linux 性能调优之存储设备调优
  • GADM 4.1 全球国家行政区划下载
  • 代码随想录算法训练营第39天(动态规划02● 62.不同路径 ● 63. 不同路径 II
  • 揭秘:IT行业有哪些证书含金量高?
  • Python算法题集_矩阵置零
  • app对接优量汇收益如何?
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【node学习】协程
  • 【个人向】《HTTP图解》阅后小结
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • css系列之关于字体的事
  • extjs4学习之配置
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • gops —— Go 程序诊断分析工具
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • java2019面试题北京
  • java8 Stream Pipelines 浅析
  • javascript从右向左截取指定位数字符的3种方法
  • JavaScript设计模式之工厂模式
  • JWT究竟是什么呢?
  • Linux中的硬链接与软链接
  • MaxCompute访问TableStore(OTS) 数据
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • unity如何实现一个固定宽度的orthagraphic相机
  • vagrant 添加本地 box 安装 laravel homestead
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 测试开发系类之接口自动化测试
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 使用权重正则化较少模型过拟合
  • 我建了一个叫Hello World的项目
  • 一份游戏开发学习路线
  • 用Python写一份独特的元宵节祝福
  • $.ajax()方法详解
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (二)正点原子I.MX6ULL u-boot移植
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (十三)Flask之特殊装饰器详解
  • (五)Python 垃圾回收机制
  • (学习日记)2024.01.09
  • (一)appium-desktop定位元素原理
  • (转)setTimeout 和 setInterval 的区别
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]