MySQL进程CPU 飙升900%,领导让我查什么原因?

说一下问题:CPU飙升200% 以上是生产容易发生的场景

场景:1:MySQL进程飙升900%

大家在使用MySQL过程,想必都有遇到过CPU突然过高,或者达到200%以上的情况。

数据库执行查询或数据修改操作时,系统需要消耗大量的CPU资源维护从存储系统、内存数据中的一致性。

并发量大并且大量SQL性能低的情况下,比如字段是没有建立索引,则会导致快速CPU飙升,如果还开启了慢日志记录,会导致性能更加恶化。生产上有MYSQL 飙升900% 的恶劣情况。

场景2:Java进程飙升900%

一般来说Java 进程不做大量 CPU 运算,正常情况下,CPU 应该在 100~200% 之间,

但是,一旦高并发场景,要么走到了死循环,要么就是在做大量的 GC, 容易出现这种 CPU 飙升的情况,CPU飙升900%,是完全有可能的。

其他场景:其他的类似进程飙升900%的场景

比如Redis、Nginx等等。

陈某提示:大家介绍场景的时候,就说自己主要涉及了两个场景, Java进程飙升900%、MySQL进程飙升900%两种场景,其实,这两个场景就足够讲半天了, 其他的,使用规避技巧规避一下就行。

场景一:MySQL进程CPU飙升到900%,怎么处理?

定位过程:

  • 使用top 命令观察,确定是mysqld导致还是其他原因。

  • 如果是mysqld导致的,show processlist,查看session情况,确定是不是有消耗资源的sql在运行。

  • 找出消耗高的 sql,看看执行计划是否准确, index 是否缺失,或者实在是数据量太大造成。

处理过程:

  • kill 掉这些线程(同时观察 cpu 使用率是否下降), 一般来说,肯定要 kill 掉这些线程(同时观察 cpu 使用率是否下降),等进行相应的调整(比如说加索引、改 sql、改内存参数)之后,再重新跑这些 SQL。

  • 进行相应的调整(比如说加索引、改 sql、改内存参数)

    index 是否缺失,如果是,则 建立索引。也有可能是每个 sql 消耗资源并不多,但是突然之间,有大量的 session 连进来导致 cpu 飙升,这种情况就需要跟应用一起来分析为何连接数会激增,再做出相应的调整,比如说限制连接数等;

  • 优化的过程,往往不是一步完成的,而是一步一步,执行一项优化措辞,再观察,再优化。

场景1的真实案例:MySQL数据库优化的真实案例

陈某提示:以下案例,来自互联网。大家参考一下,准备一个自己的案例。

本问题亲身经历过。

之前开发同事编写的SQL语句,就导致过线上CPU过高,MySQL的CPU使用率达到900%+,通过优化最后降低到70%~80%。下面说说个人在这个过程中的排查思路。

首先,我们要对问题定位而不是盲目的开启什么 慢日志,在并发量大并且大量SQL性能低的情况下,开启慢日志无意是将MySQL推向崩溃的边缘。

当时遇到这个情况,分析了当前的数据量、索引情况、缓存使用情况。目测数据量不大,也就几百万条而已。接下来就去定位索引、缓存问题。

  • 经过询问,发现很多查询都是走MySQL,没有用到缓存。

  • 既然没有用到缓存,则是大量请求全部查询MySQL导致。通过下面的命令查看:

show processlist;

发现类似很多相同的SQL语句,一直处于query状态中。

select id form user where user_code = 'xxxxx';

初步分析可能是 user_code 字段没有索引导致。接着查询user表的索引情况:

show index form user;

发现这个字段是没有建立索引。增加索引之后,该条SQL查询能够正常执行。

3、没隔一会,又发生大量的请求超时问题。接着进行分析,发现是开启了 慢日志查询。大量的SQL查询语句超过慢日志设置的阀值,于是将慢日志关闭之后,速度瞬间提升。CPU的使用率基本保持在300%左右。但还不是理想状态。

4、紧接着将部分实时查询数据的SQL语句,都通过缓存(redis)读写实现。观察一段时间后,基本维持在了70%~80%。

总结:其实本次事故的解决很简单,就是添加索引与缓存结合使用。

  • 不推荐在这种CPU使用过高的情况下进行慢日志的开启。因为大量的请求,如果真是慢日志问题会发生日志磁盘写入,性能贼低。

  • 直接通过MySQL show processlist命令查看,基本能清晰的定位出部分查询问题严重的SQL语句,在针对该SQL语句进行分析。一般可能就是索引、锁、查询大量字段、大表等问题导致。

  • 再则一定要使用缓存系统,降低对MySQL的查询频次。

  • 对于内存调优,也是一种解决方案。

场景2展开:Java进程CPU飙升到900%,怎么处理?

定位过程:

CPU飙升问题定位的一般步骤是:

  • 首先通过top指令查看当前占用CPU较高的进程PID;

  • 查看当前进程消耗资源的线程PID:top -Hp PID

  • 通过print命令将线程PID转为16进制,根据该16进制值去打印的堆栈日志内查询,查看该线程所驻留的方法位置。

  • 通过jstack命令,查看栈信息,定位到线程对应的具体代码。

  • 分析代码解决问题。

处理过程:

  • 如果是空循环,或者空自旋。

    处理方式:可以使用Thread.sleep或者加锁,让线程适当的阻塞。

  • 在循环的代码逻辑中,创建大量的新对象导致频繁GC。比如,从mysql查出了大量的数据,比如100W以上等等。

    处理方式:可以减少对象的创建数量,或者,可以考虑使用 对象池。

  • 其他的一些造成CPU飙升的场景,比如 selector空轮训导致CPU飙升 。

    处理方式:参考Netty源码,无效的事件查询到了一定的次数,进行 selector 重建。

Java的CPU 飙升700%优化的真实案例

陈某提示:以下案例,来自互联网。大家参考一下,准备一个自己的案例。

最近负责的一个项目上线,运行一段时间后发现对应的进程竟然占用了700%的CPU,导致公司的物理服务器都不堪重负,频繁宕机。

那么,针对这类java进程CPU飙升的问题,我们一般要怎么去定位解决呢?、

采用top命令定位进程

登录服务器,执行top命令,查看CPU占用情况,找到进程的pid

top

图片

很容易发现,PID为29706的java进程的CPU飙升到700%多,且一直降不下来,很显然出现了问题。

使用top -Hp命令定位线程

使用 top -Hp命令(为Java进程的id号)查看该Java进程内所有线程的资源占用情况(按shft+p按照cpu占用进行排序,按shift+m按照内存占用进行排序)

此处按照cpu排序:

top -Hp 23602

图片

很容易发现,多个线程的CPU占用达到了90%多。我们挑选线程号为30309的线程继续分析。

使用jstack命令定位代码

1.线程号转换5为16进制

printf “%x\n” 命令(tid指线程的id号)将以上10进制的线程号转换为16进制:

printf "%x\n" 30309

图片

转换后的结果分别为7665,由于导出的线程快照中线程的nid是16进制的,而16进制以0x开头,所以对应的16进制的线程号nid为0x7665

2.采用jstack命令导出线程快照

通过使用dk自带命令jstack获取该java进程的线程快照并输入到文件中:

jstack -l 进程ID > ./jstack_result.txt

命令(为Java进程的id号)来获取线程快照结果并输入到指定文件。

jstack -l 29706 > ./jstack_result.txt

3.根据线程号定位具体代码

在jstack_result.txt 文件中根据线程好nid搜索对应的线程描述

cat jstack_result.txt |grep -A 100 7665

图片

根据搜索结果,判断应该是ImageConverter.run()方法中的代码出现问题

当然,这里也可以直接采用

jstack <pid> |grep -A 200 <nid>

来定位具体代码

$jstack 44529 |grep -A 200 ae24
"System Clock" #28 daemon prio=5 os_prio=0 tid=0x00007efc19e8e800 nid=0xae24 waiting on condition [0x00007efbe0d91000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:340)
at java.util.concurrentC.TimeUnit.sleep(TimeUnit.java:386)
at com.*.order.Controller.OrderController.detail(OrderController.java:37) //业务代码阻塞点

分析代码解决问题

下面是ImageConverter.run()方法中的部分核心代码。

逻辑说明:

/存储minicap的socket连接返回的数据 (改用消息队列存储读到的流数据) ,设置阻塞队列长度,防止出现内存溢出
//全局变量
private BlockingQueue<byte[]> dataQueue = new LinkedBlockingQueue<byte[]>(100000);
//消费线程
@Override
public void run() {
//long start = System.currentTimeMillis();
while (isRunning) {
//分析这里从LinkedBlockingQueue
if (dataQueue.isEmpty()) {
continue;
}
byte[] buffer = device.getMinicap().dataQueue.poll();
int len = buffer.length;
}

在while循环中,不断读取堵塞队列dataQueue中的数据,如果数据为空,则执行continue进行下一次循环。

如果不为空,则通过poll()方法读取数据,做相关逻辑处理。

初看这段代码好像每什么问题,但是如果dataQueue对象长期为空的话,这里就会一直空循环,导致CPU飙升。

那么如果解决呢?

分析LinkedBlockingQueue阻塞队列的API发现:

//取出队列中的头部元素,如果队列为空则调用此方法的线程被阻塞等待,直到有元素能被取出,如果等待过程被中断则抛出InterruptedException
E take() throws InterruptedException;
//取出队列中的头部元素,如果队列为空返回null
E poll();

这两种取值的API,显然take方法更时候这里的场景。

代码修改为:

while (isRunning) {
/* if (device.getMinicap().dataQueue.isEmpty()) {
continue;
}*/
byte[] buffer = new byte[0];
try {
buffer = device.getMinicap().dataQueue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
……
}

重启项目后,测试发现项目运行稳定,对应项目进程的CPU消耗占比不到10%。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1131470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArcGIS Pro查看多期数据变化!卷帘+多地图联动齐上架

之前介绍了ArcGIS效果工具条实现查看两期数据变化。 那么&#xff0c;如果在ArcGIS Pro中又该如何操作呢&#xff1f;ArcGIS Pro中其实有对应的卷帘效果与比较功能&#xff01;一样可以把卷帘和透明度用起来。 多期数据源的加载查看&#xff1a; 2025年最新&#xff08;全球&a…

Stream流式编程 中间操作和终端操作介绍

一、先立心智模型&#xff1a;Stream 到底是什么&#xff1f; Stream 不是集合&#xff0c;不存数据&#xff0c;不改数据。 它是&#xff1a; 对数据源的一次性、惰性的、函数式“处理流程描述” 三点必须刻在脑子里&#xff1a; 惰性执行&#xff1a;中间操作不执行&#x…

【苹果分级】基于matlab GUI机器视觉苹果质量检测及总分级系统【含Matlab源码 14878期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

【课程设计/毕业设计】基于深度学习的印刷体数字和字母识别基于python深度学习的印刷体数字和字母识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

深度学习计算机毕设之机器学习基于CNN深度学习的遥感图片识别沙漠湖泊和森林

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

ArcGIS土地利用现状图制作全流程

将之前《ArcGIS Pro从0到1制作广东省土地利用现状图》直播回重新录制一遍给大家学习。详见下方视频教学 主要涉及的内容包括&#xff1a;ArcGIS土地利用现状图全流程教学&#xff08;从零数据下载、镶嵌、裁剪、属性表连接整理、面积区域汇总计算、地图全流程制作&#xff09; …

Merge3D 三维引擎中 GeoJSON 数据加载的整体设计

你想分析Merge3D&#xff08;融合引擎&#xff09;三维引擎中GeoJSON数据加载的整体设计&#xff0c;并确认是否有一个统一的类来支持点、线、面等所有几何类型的GeoJSON数据加载。 Merge3D GeoJSON 加载核心实现原理 Merge3D 中 GeoJsonLayer 能一站式支持点、线、面&#xff…

K8S安装指南与核心操作命令汇总

在云原生时代&#xff0c;Kubernetes&#xff08;简称K8S&#xff09;已成为容器编排的事实标准&#xff0c;无论是企业级应用部署还是个人技术学习&#xff0c;掌握K8S的安装与基础操作都是必备技能。本文将从安装前置准备、具体安装步骤&#xff08;以主流的kubeadm方式为例&…

企业知识管理新范式:用ChatWiki+大模型实现“一问即答“[必学收藏]

ChatWiki是一款企业级AI知识库构建平台&#xff0c;通过四步简单操作&#xff08;接入AI模型、创建知识库、配置AI机器人、实现智能应答&#xff09;&#xff0c;将分散的企业文档转化为可对话的智能资产。它解决了知识孤岛、更新低效和交互割裂三大痛点&#xff0c;适用于新员…

15_嵌入式C与控制理论入门:控制算法的定点数优化与精度平衡

嵌入式C与控制理论入门:控制算法的定点数优化与精度平衡 做嵌入式控制开发的你,大概率遇到过这种窘境:精心设计的PID、模糊控制算法,在PC上用浮点数仿真时效果拉满,可移植到STM32、TI C2000等MCU后,要么运算速度慢到突破实时控制阈值,要么因MCU缺少浮点运算单元(FPU)导…

新下证美国外观专利:42款亚马逊侵权高危新品,跨境卖家立即自查!

2025 年 12 月 30 日&#xff0c;美国专利局集中公开了一批外观专利授权公告&#xff0c;涵盖家居用品、母婴玩具、宠物用品、电子设备等四大类43款产品。跨境卖家销售同款或近似款产品时&#xff0c;需警惕侵权风险。以下专利均于 2025 年 12 月 30 日正式授权&#xff0c;涵盖…

【毕业设计】python基于CNN深度学习的遥感图片识别沙漠湖泊和森林

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Mysql 驱动程序

一、MySQL 驱动程序的概念 驱动程序的主要功能包括&#xff1a; 建立连接&#xff1a;驱动程序负责处理应用程序和 MySQL 数据库之间的网络连接。执行 SQL 语句&#xff1a;驱动程序将应用程序中的 SQL 语句发送到数据库服务器&#xff0c;并接收服务器的响应。处理结果集&am…

【值得收藏】Agent-Graph:构建强大多智能体系统的完整教程

Agent-Graph是基于上下文工程的多智能体系统&#xff0c;提供Agent管理、Workflow可视化编排、Subagent任务分解、双层记忆架构、MCP集成等核心功能。支持团队协作&#xff0c;可分享对话并导出为训练数据&#xff0c;适合构建复杂AI工作流。项目开源&#xff0c;提供完整文档和…

ArcGIS汉化不成功的解决方案

很多粉丝朋友在ArcGIS10.X系列安装出现了不能汉化的问题&#xff0c;即使是在装了汉化包的情况下。今天我们来做一个总结&#xff01; &#xff08;ArcGIS Pro汉化不成功查看&#xff1a;ArcGIS Pro或ArcGIS汉化不了&#xff1f;汉化包装不上&#xff1f;&#xff09; ArcGIS的…

港美主流期货 API 接入全指南:TradingView 看盘策略

最近帮朋友搭建港美期货的自动交易系统&#xff0c;踩了不少 API 接入的坑——比如选 API 时没注意费率结构&#xff0c;初期测试没问题&#xff0c;跑实盘才发现手续费比预期高很多&#xff1b;还有接入时忽略了行情延时的问题&#xff0c;导致策略信号滞后。 索性整理一篇全…

【毕业设计】基于python深度学习的印刷体数字和字母识别基于python的印刷体数字和字母识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

一部手机不够玩?鸿蒙如何把多设备变成一个游戏系统(实战解析)

摘要 这两年&#xff0c;跨屏协作在鸿蒙生态里出现得越来越频繁。 从最早的文件互传、多屏办公&#xff0c;到现在的教育课堂、车机联动&#xff0c;设备之间已经不再是“各干各的”。 在游戏领域&#xff0c;这个变化更明显&#xff1a; 一块屏幕已经不够玩玩家希望多设备一起…

.NET开发必备:Redis、IoC、AutoMapper实战指南

1.Redis、Ioc、AutoMapper等常用技术在现代 .NET&#xff08;尤其是 ASP.NET Core&#xff09;开发中&#xff0c;Redis、IoC&#xff08;Inversion of Control&#xff09; 和 AutoMapper 是非常常见且重要的技术/工具。下面分别对它们进行简要介绍&#xff0c;并说明其用途和…

大型C项目的头文件管理:3招解决“重复包含”与“依赖混乱”

大型C项目的头文件管理:3招解决“重复包含”与“依赖混乱” 做过大型C项目开发或维护的你,大概率踩过头文件的“连环坑”:编译时突然弹出一堆“重定义”错误,排查半天发现是同一个头文件被重复包含;项目迭代到中后期,头文件之间形成“闭环依赖”,改一个底层头文件的宏定…