线上cpu报警的一次接口优化

简介: 春天到了大地都复苏了,沉寂了很久的cpu也开始慢慢复苏了,所谓前人埋坑后人填坑,伴随着阿里云监控报警,线上CPU使用率暴增,于是就开始了排查之路。

前言
春天到了大地都复苏了,沉寂了很久的cpu也开始慢慢复苏了,所谓前人埋坑后人填坑,伴随着阿里云监控报警,线上CPU使用率暴增,于是就开始了排查之路。

出现问题现象
由于服务的cpu暴增到达一定程度,导致服务假死,接口调用全部返回502不可用,链接超时导致服务器方面无法给予正常的反应。

通过查看阿里云数据库RDS,慢sql日志进行分析,发现数据库的CPU使用率在某一时间到达了96%,这不完犊子了。

导出监控平台分析的慢sql,看到这个sql平均的执行时间,真的是再次刷新了我的认知,平均执行法时间2分多钟,这怕是执行的黄花菜都要凉了。

问题排查
首先根据阿里云分析的慢sql进行再次分析,sql肯定是有问题的,而导致服务不可用的原因还需要看微服务的负载配置,于是我去查看了该服务Nacos的配置。这里我们看到该服务Ribbon超时时间为15妙,就意味着接口如果执行超过这个时间接口就无法继续执行,从而出现服务假死不可用的现象。
服务接口调用长时间没有反应,ribbon负载均衡会触发熔断机制,对服务进行保护,让服务不可调用。

涉及接口
通过慢sql对应到问题接口,对接口逻辑进行梳理,排查接口涉及到的sql。
通过对业务逻辑分析,发现这个接口对慢sql执行了两次,一次是正常分页查询数据,第二次是没有加分页参数,那么将全表查询,对查询的结果根据字段进行过滤,过滤出count条数。

其次是发现前端对这个接口进行两次调用,咱也不知道为什么,但是在请求上看来,访问该页面同一接口确实进行两次调用,本来接口就很慢了,这简直就是一个暴击。

慢sql分析
因为动态sql比较长,我只挑选我认为sql不是很合适的地方

查询列中用select嵌套查询

  1. sql中出现大量字段in的查询

In是走索引的查询,但是当in括号里面的条件比较多的情况下,就是传入的参数这个list列表长度比较大的情况下,是不走索引的,会进行全表扫描,in最终走不走索引其实是跟后面的数据有关系的。

表中数据量
主表大概在25w多数据,关联表比较大在170w数据。
主表索引加了很多,未必就是一件好事,索引的设置完全按照搜索条件来设置也未必对,涉及到关联表一定要添加索引。

关联表出现了很多重复数据,因为不了解之前业务的逻辑,不太清楚为什么出现很多重复数据,这也是表中数据量很大的原因,从而导致影响查询效率。
接口优化
既然现在问题找到了,就可以进行优化了,我说下我优化的思路,主要是从下往上进行优化。

慢sql优化,主要是针对嵌套查询改为left join 左外联查询,减少了in查询,查询出来的数据在代码中进行筛选,减少了一些不必要的索引。

通过conut()统计需要的条数,在所有count里面,count()是效率最高的了,有兴趣的朋友可以去了解下。

  1. 业务代码方面,限制了时间筛选的区间,从原来的不限时间勾选范围,跟业务进行沟通后,调整为只允许选择一周的时间范围进行查询,前后端都进行限制。

优化结果对比
由此可见优化后的执行效率还是比较高的,线上服务也没有在报警了,但是还有其他服务在报警…. 还有磁盘使用率到达90%…. Wtf真的是优化之路途漫漫啊。

总结
此次对于接口的优化点还不是很深,主要点是对代码、sql、业务进行优化,还未涉及到分表、加入缓存热点数据进行预热、修改负载均衡超时时间等…
其实偶尔的填坑也是一种学习的方式,不说了继续填坑了,哦!不对优化代码了~

相关文章
|
6月前
|
编译器 Linux C语言
C++新特性“CPU优化对齐”
C++新特性“CPU优化对齐”
124 3
|
3月前
|
SQL 监控 关系型数据库
MySQL优化: CPU高 处理脚本 pt-kill脚本
MySQL优化: CPU高 处理脚本 pt-kill脚本
|
1月前
|
存储 缓存 算法
CPU优化
【10月更文挑战第7天】
30 1
|
3月前
|
监控 Java Linux
CPU被打满/CPU 100%:高效诊断与优化策略
【8月更文挑战第28天】在日常的工作与学习中,遇到CPU使用率飙升至100%的情况时,往往意味着系统性能受到严重影响,甚至可能导致程序响应缓慢或系统崩溃。本文将围绕这一主题,分享一系列高效诊断与优化CPU使用的技术干货,帮助大家快速定位问题并恢复系统性能。
211 1
|
4月前
|
Java
手把手教你java CPU飙升300%如何优化
手把手教你java CPU飙升300%如何优化
60 0
|
4月前
|
监控 Java 中间件
FGC频繁导致CPU 飙升定位及JVM配置优化总结
FGC频繁导致CPU 飙升定位及JVM配置优化总结
160 0
|
4月前
|
Linux 调度
部署02-我们一般接触的是Mos和Wimdows这两款操作系统,很少接触到Linux,操作系统的概述,硬件是由计算机系统中由电子和机械,光电元件所组成的,CPU,内存,硬盘,软件是用户与计算机接口之间
部署02-我们一般接触的是Mos和Wimdows这两款操作系统,很少接触到Linux,操作系统的概述,硬件是由计算机系统中由电子和机械,光电元件所组成的,CPU,内存,硬盘,软件是用户与计算机接口之间
|
4月前
|
缓存 弹性计算 监控
云服务器 CPU 使用率高的问题排查与优化
云服务器 CPU 使用率高的问题排查与优化
403 0
|
5月前
|
SQL 数据处理 API
实时计算 Flink版产品使用问题之holo的io以及cpu使用较为稳定,sink端busy一直在20%左右,有时候50%,该如何优化
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
存储 机器学习/深度学习 测试技术
mnn-llm: 大语言模型端侧CPU推理优化
mnn-llm: 大语言模型端侧CPU推理优化
969 1