排查 Linux cup 飙升问题

2023-11-12

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

如果我们项目在linux上部署成功并正常运行,但是发现linux的cpu飙升。这时就需要对cpu飙升问题进行排查。以下是排查方法。

  • Java 进程cpu飙升问题
  • Mysql 进程cup飙升

Java 执行过程

一、使用 top 命令

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
top命令可以动态地持续监听进程运行情况,默认情况下是按照cpu的使用率倒叙排序。所以我们直接看排在最前面的java进程就可以。

代码如下(示例):

[root@mtjg-149 ~]# top

在这里插入图片描述

通过结果可以看出第一行的java进程cpu使用率最高,占比75.5%.这样我们就可以得到cpu占比高的进程ID。PID=13369.
我们也可以通过grep筛选java进程。

[root@mtjg-149 ~]# top | grep java                                                                                         
13369 root      20   0 7030220  90936  12112 S  68.8  0.6   1:29.55 java                                                                                         
 8793 root      20   0 6953320 898624  14596 S   1.0  5.5   2169:10 java                                                                                         
26108 root      20   0 6908128 859776  14552 S   1.0  5.3   2094:55 java                                                                                         
28879 root      20   0 6959496 762248  14556 S   1.0  4.7 756:23.38 java                                                                                         
30804 root      20   0 6986348   1.4g  14616 S   0.3  9.0  13869:03 java                                                                                         
13369 root      20   0 7030220  90936  12112 S  63.9  0.6   1:31.48 java                                                                                         
28879 root      20   0 6959496 762248  14556 S   1.0  4.7 756:23.41 java                                                                                         
26108 root      20   0 6908128 859776  14552 S   0.7  5.3   2094:55 java                                                                                         
13369 root      20   0 7030220  90936  12112 S  52.2  0.6   1:33.05 java                                                                                         
26108 root      20   0 6908128 859776  14552 S   1.0  5.3   2094:55 java                                                                                         
28879 root      20   0 6959496 762248  14556 S   1.0  4.7 756:23.44 java                                                                                         
 8793 root      20   0 6953320 898624  14596 S   0.7  5.5   2169:10 java                                                                                         
29341 root      20   0 5412616 438676  11176 S   0.3  2.7 425:22.94 java 

二、使用ps命令查看cpu占比高的PID

我们通过ps命令查看该进程对应的哪个线程占用cpu资源比较高。

[root@mtjg-149 ~]# ps -mp 13369 -o THREAD,tid,time
USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
root     63.7   -    - -         -      -     - 00:04:57
root      0.0  19    - futex_    -      - 13369 00:00:00
root     63.4  19    - n_tty_    -      - 13370 00:04:56
root      0.0  19    - futex_    -      - 13371 00:00:00
root      0.0  19    - futex_    -      - 13372 00:00:00
root      0.0  19    - futex_    -      - 13373 00:00:00
root      0.0  19    - futex_    -      - 13374 00:00:00
root      0.0  19    - futex_    -      - 13375 00:00:00
root      0.0  19    - futex_    -      - 13376 00:00:00
root      0.0  19    - futex_    -      - 13377 00:00:00
root      0.0  19    - futex_    -      - 13378 00:00:00
root      0.0  19    - futex_    -      - 13379 00:00:00
root      0.0  19    - futex_    -      - 13380 00:00:00
root      0.0  19    - futex_    -      - 13381 00:00:00
root      0.0  19    - futex_    -      - 13382 00:00:00
root      0.0  19    - futex_    -      - 13383 00:00:00
root      0.0  19    - futex_    -      - 13384 00:00:00
root      0.0  19    - futex_    -      - 13385 00:00:00
root      0.0  19    - futex_    -      - 13386 00:00:00
root      0.0  19    - futex_    -      - 13387 00:00:00
root      0.0  19    - futex_    -      - 13388 00:00:00

通过上面可以看到第一行为总进程信息,显示cpu的总占比。下面几行是该进程中每条线程的对应信息与cpu占比。我们可得到对应的线程ID为13370对cpu占比比较高。所以我们需要对TID=13379线程进行分析。
我们也可以使用top -Hp [进程号]命令查询下面对应的线程,获取占比较高的线程ID。

三、将对应的TID转换为16进制

我们分析java线程会使用到jdk自带的jstack工具,该工具需要16进制的线程ID进行筛选,所以我们需要把需要分析的线程ID转换为16进制。

[root@mtjg-149 ~]# printf "%x\n" 13370
343a

我们可以看到13370的16进制为343a

四、使用jdk自带的命令jstack,拉出指定线程的堆栈信息

[root@mtjg-149 ~]# jstack 13369 |grep 343a -A150
"main" #1 prio=5 os_prio=0 tid=0x00007f5dc0009800 nid=0x343a runnable [0x00007f5dc8457000]
   java.lang.Thread.State: RUNNABLE
	at java.io.FileOutputStream.writeBytes(Native Method)
	at java.io.FileOutputStream.write(FileOutputStream.java:326)
	at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
	at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
	- locked <0x00000006c7c27f50> (a java.io.BufferedOutputStream)
	at java.io.PrintStream.write(PrintStream.java:482)
	- locked <0x00000006c7c0c380> (a java.io.PrintStream)
	at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
	at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
	at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)
	- locked <0x00000006c7c0b060> (a java.io.OutputStreamWriter)
	at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)
	at java.io.PrintStream.newLine(PrintStream.java:546)
	- locked <0x00000006c7c0c380> (a java.io.PrintStream)
	at java.io.PrintStream.println(PrintStream.java:737)
	- locked <0x00000006c7c0c380> (a java.io.PrintStream)
	at WileDemo.main(WileDemo.java:8)

"VM Thread" os_prio=0 tid=0x00007f5dc0081000 nid=0x3443 runnable 

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f5dc001e800 nid=0x343b runnable 

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007f5dc0020800 nid=0x343c runnable 

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00007f5dc0022800 nid=0x343d runnable 

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00007f5dc0024000 nid=0x343e runnable 

"GC task thread#4 (ParallelGC)" os_prio=0 tid=0x00007f5dc0026000 nid=0x343f runnable 

"GC task thread#5 (ParallelGC)" os_prio=0 tid=0x00007f5dc0028000 nid=0x3440 runnable 

"GC task thread#6 (ParallelGC)" os_prio=0 tid=0x00007f5dc0029800 nid=0x3441 runnable 

"GC task thread#7 (ParallelGC)" os_prio=0 tid=0x00007f5dc002b800 nid=0x3442 runnable 

"VM Periodic Task Thread" os_prio=0 tid=0x00007f5dc00d1000 nid=0x344c waiting on condition 

JNI global references: 202

[root@mtjg-149 ~]# 

jstack 13369 |grep 343a -A150
该命令中 13369 代表着进程ID,343a代表着线程ID的16进制,-A150代表着列出最多150行堆栈信息。

五、对显示的堆栈信息进行分析

这一步是最难的一步,也是对研发人员要求最高的一部,需要研发人员有大量的经验。
这里的堆栈信息可以看到是在WileDemo类中main方法的第8行出现问题,我这里是在此处写了个while死循环。
在这里插入图片描述

总结

每一个项目出现cpu占比过高的原因都不尽相同,在这里总结了常见的cpu飙升的原因

  1. while死循环,或者循环次数超大的循环。
  2. 超大的运算,如超大的浮点运算。
  3. 频繁的Young GC。如大量的json数据转实体对象。
  4. 多线程连接池,线程频繁地切换。我们使用top命令时可以看到CPU(s)一行,如果us用户空间占比过高,则说明是程序线程计算高引起的,通过堆栈分析可以找到原因;如果sy内核空间占比过高,那么一般是由于线程上下文切换引起的。

Mysql 执行过程

一、使用 top 命令

如 Java 执行过程一样,先使用 top 命令查看占比高的进程是不是 mysqld,如果是 mysqld 则表示 mysql 问题。

二、使用 SHOW PROCESSLIST 语句

当 Mysql 的 CPU 使用率 过高的时候,不要盲目开启慢日志,开启慢日志可能会让 Mysql 推向崩溃。
一般是使用 SHOW PROCESSLIST 语句,定位大量存在的相同的 SQL 语句。对这些 SQL 语句进行针对性的分析。可能引起问题的原因通常是索引、锁、查询大量字段、大表等。

SHOW PROCESSLIST;

执行结果:
在这里插入图片描述

三、添加缓存

对于一些查询频率过高的 SQL 语句,针对性的添加到 redis 缓存,降低 Msql 的压力。
如果执行 SHOW PROCESSLIST 操作查到 sql 语句,发现该 sql 语句并不慢查询,或者优化 sql 语句之后 CPU 运行占比依然很高。那么我们就需要考虑使用添加缓存的方式减轻数据库的压力。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

排查 Linux cup 飙升问题 的相关文章

  • 多处理:仅使用物理核心?

    我有一个函数foo它消耗大量内存 我想并行运行多个实例 假设我有一个有 4 个物理核心的 CPU 每个核心有两个逻辑核心 我的系统有足够的内存来容纳 4 个实例foo并行但不是 8 个 此外 由于这 8 个核心中的 4 个是逻辑核心 我也不
  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • Condition 接口中的 signalAll 与对象中的 notificationAll

    1 昨天我才问过这个问题条件与等待通知机制 https stackoverflow com questions 10395571 condition vs wait notify mechanism 2 我想编辑相同的内容并在我的问题中添加
  • 主线程如何在该线程之前运行?

    我有以下代码 public class Derived implements Runnable private int num public synchronized void setA int num try Thread sleep 1
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • 具有共享依赖项的多模块项目的 Gradle 配置

    使用 gradle 制作第一个项目 所以我研究了 spring gradle hibernate 项目如何组织 gradle 文件 并开始制作自己的项目 但是 找不到错误 为什么我的配置不起作用 子项目无法解决依赖关系 所以项目树 Root
  • 获取给定类文件的目录路径

    我遇到的代码尝试从类本身的 class 文件所在的同一目录中读取一些配置文件 File configFiles new File this getClass getResource getPath listFiles new Filenam
  • Java 收集返回顶级项目的映射的嵌套流

    我有以下模型 class Item String name List
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • 如何在 Eclipse Java 动态 Web 项目中使用 .properties 文件?

    我正在 Eclipse 中开发动态 Web 项目 我创建了一个 properties 文件来存储数据库详细信息 用户名 密码等 我通过右键单击项目和 New gt File 添加它 我使用了Java util包Properties类 但它不
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • 解决错误javax.mail.AuthenticationFailedException

    我不熟悉java中发送邮件的这个功能 我在发送电子邮件重置密码时遇到错误 希望你能给我一个解决方案 下面是我的代码 public synchronized static boolean sendMailAdvance String emai
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • 挂钩 Eclipse 构建过程吗?

    我希望在 Eclipse 中按下构建按钮时能够运行一个简单的 Java 程序 目前 当我单击 构建 时 它会运行一些 JRebel 日志记录代码 我有一个程序可以解析 JRebel 日志文件并将统计信息存储在数据库中 是否可以编写一个插件或
  • 如何更改 Apache 服务器的根目录? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何更改 Apache 服务器的文档根目录 我基本上想要localhost从 来 users spencer projects目录而不是
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • 在android中跟踪FTP上传数据?

    我有一个运行 Android 的 FTP 系统 但我希望能够在上传时跟踪字节 这样我就可以在上传过程中更新进度条 安卓可以实现这个功能吗 现在 我正在使用org apache common net ftp我正在使用的代码如下 另外 我在 A

随机推荐

  • 垂直广告是什么意思_网上常看到带货这个词,那么带货到底是什么意思?又要怎么通过平台带货呢?...

    网上常看到带货这个词 那么带货到底是什么意思 又要怎么通过平台带货呢 直播带货就是通过短视频平台 吸引消费者来购买自己所售卖的产品 可以投放广告或是与达人合作进行带货 短视频 品牌营销优势 新一代广告宠儿 5G时代即将来临 人们越来越习惯且
  • HTML5----FormData实例用法

    ajax 异步上传文件 1 前言 在网页与后台的交互中 用的最多的网络交互方式之一就是ajax ajax 是免刷新页面就能从进行post与get方式的提交表单和获取服务端数据 但是在原先的ajax中 是不能携带文件上传的 但是由于h5里面的
  • Mysql数据库手册

    数据库基本概念 1 数据库 就是数据的仓库 由表 关系 操作对象组成 2 表 由行和列组成 数据都存放在表中 由于mysql是关系数据库 所以表又被称为关系 3 字段 就是属性 4 记录 一行数据就是一条记录 也是一条实体 需要设置主键 5
  • 基于惯性动作捕捉技术进行快速动画制作教程

    长久以来动画制作流程上有着诸多不可回避的问题 尤其在于角色动画的制作周期和动画效果方面 一般来说 每一秒钟的角色动画都需要动画师手动关键帧制作耗费8小时才能完成 也就是说 一个动画师每个月只能制作出22秒动画 动作捕捉技术为动画制作者带来福
  • Elasticsearch-基本命令

    基本命令 创建索引 添加数据 删除数据 简单查询 复杂查询1 复杂查询2 获得所有index 获得所有mapping type 根据某个字段精确查找 api的分组查询 bool查询 创建索引 put http localhost 9200
  • LSTM生成文本(字符级别)

    20200817 引言 在网上看到过一些利用深度学习来生成文本的文章 不管生成宋词也好 生成小说也好 各种各样 都是利用深度学习的模型来生成新的东西 之前的时候 我也一直觉得 他们这种生成方式 应该就是记忆性的东西 他并没有真正的从语义的角
  • jdbc导出mysql数据库_原生JDBC方式导出MySQL数据库

    现在的应用系统越来越多的都是业务系统与数据库系统是分离的 这里就会涉及到数据库备份的问题 如果业务系统与数据库是在同一服务器 可以很简单的用mysql自带的命令 mysqldump databases dbName gt dbNameBak
  • stm32 mqtt 如何判断心跳包发送成功_Dubbo 现有心跳方案总结以及改进建议

    1 前言 设计一个好的心跳机制并不是一件容易的事 就我所熟知的几个 RPC 框架 它们的心跳机制可以说大相径庭 这篇文章我将探讨一下如何设计一个优雅的心跳机制 主要从 Dubbo 的现有方案以及一个改进方案来做分析 2 预备知识 因为后续我
  • linux的inode暴增

    author skate time 2012 04 26 linux的inode暴增 今天刚到公司 接收到一个报警短信 一个数据库的inode使用率达到99 root DBtmp df h Filesystem Size Used Avai
  • 我 JS 写的好好的,为什么要用那么复杂的 TS

    今年前端面试有个很有意思的现象 最经典的 JavaScript 基础类面试题 不在被面试官宠幸 原因很简单 现在市场经济收紧 公司的项目决策中往往切割掉了边角试错成本 而 TypeScript 无疑更适合构建大项目和管理 就像 Java 和
  • 彻底理解embedding

    本文转载自https blog csdn net weixin 42078618 article details 84553940 版权问题请联系博主删除 首先 我们有一个one hot编码的概念 假设 我们中文 一共只有10个字 只是假设
  • 毕业设计记录-Pytorch学习-自己手写数字识别

    今天用之前的模型训练手写数字数据集 训练了50轮 效果如下 然后我就准备用自己手写的数字来检验看看 模型的准确率 自己找的一些数字图片 但是经过测试全部预测成3 很不解 搞了好几个小时 到最后无意间看到他的数据集的时候才知道哪出了问题 这是
  • Linux网络服务部署yum仓库

    目录 1 Yum概述 2 Yum实现过程 3 Yum配置文件 3 1yum主配置文件 etc yum conf 3 2仓库设置文件 etc yum repos d repo 4 yum命令详解 5 源地址 6 搭建仓库的方式 6 1搭建本地
  • MVC,MVP和MVVM架构解析

    文章目录 关于架构 框架和设计模式三者的说明 一 MVC 1 概念 2 结构 3 模式 4 优缺点 5 适用场景 二 MVP 1 概念 2 结构 3 与MVC对比 4 优缺点 5 适用场景 三 MVVM 1 结构 2 解析 3 MVVM架构
  • Java内存区域与内存溢出异常

    Java内存区域与内存溢出异常 如上图所示 首先java源代码文件 java后缀 会被java编译器编译为字节码文件 class后缀 然后再让类加载器加载各个类的字节码文件 加载完毕后 交由JVM执行引擎执行 在整个执行过程中 JVM会用一
  • spdlog日志库说明文档(超详细)

    spdlog日志库说明文档 超详细 spdlog是一个开源 快速 只有头文件的C 11日志库 code地址在https github com gabime spdlog 基础示例在https github com gabime spdlog
  • 技术点集(面试)

    怎么使用 ConcurrentHashMap 才能是线程安全的 package util import java util Map import java util concurrent ConcurrentHashMap public c
  • java session id 生成_Java通过sessionId获取Session

    Servlet2 1之后不支持SessionContext里面getSession String id 方法 但是 我们可以通过HttpSessionListener监听器和全局静态map自己实现一个SessionContext MySes
  • 我说CMMI

    一 我说CMMI之二 CMMI里有什么 CMMI划分为三个分支 适用于供方 乙方的模型 CMMI DEV 主要是针对开发类组织的 CMMI SVC 主要是针对服务类组织的 适用于需方 甲方的模型 CMMI ACQ 主要是针对采购类组织的 C
  • 排查 Linux cup 飙升问题

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 Java 执行过程 一 使用 top 命令 二 使用ps命令查看cpu占比高的PID 三 将对应的TID转换为16进制 四 使用jdk自带的命令jstack