服务器CPU飚高排查

这篇具有很好参考价值的文章主要介绍了服务器CPU飚高排查。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

排查思路

当正在运行的Java服务导致服务器的CPU突然飙高时,我们该如何排查定位到哪个接口的哪行代码导致CPU飙高的问题呢?我主要提供两个方案:

  • jstack
  • arthas
准备工作
代码准备

现在需要准备一段可以让服务器CPU飙高的代码以及把代码部署到服务环境。

@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("top")
    public void test() {
        while (true) {

        }
    }
}
打包

使用maven打包或者Docker服务将代码部署到服务器。

#整流程
mvn clean

mvn compile

mvn package

在IDEA中为:

服务器CPU飚高排查,笔记,踩坑,Linux,开发语言,java,linux

简单部署
java -jar demo1-0.0.1-SNAPSHOT.jar > demo.log &
jstack

jstack 是 JDK 提供的一个命令行工具,用于生成 Java 进程的线程转储信息(也称为线程快照)。它可以帮助诊断和调试 Java 应用程序的线程相关问题,如死锁、线程等待、线程占用CPU过高等。

jstack 命令可以在运行中的 Java 进程上执行,它会输出当前 Java 进程中所有线程的堆栈跟踪信息。这些信息包括每个线程的方法调用栈、锁信息、线程状态等。

以下是 jstack 的一些常见用途和作用:

  • 线程分析:jstack 生成的线程转储信息可以显示 Java 进程中所有线程的堆栈跟踪信息。您可以查看每个线程的调用栈,了解线程执行的代码路径和方法调用关系。
  • 死锁检测:通过查看线程的锁信息,jstack 可以帮助您发现是否存在死锁情况。它会显示每个线程当前持有的锁和等待的锁,以及导致死锁的锁依赖关系。
  • 线程等待:jstack 可以显示线程的等待状态,帮助您确定是否存在线程等待某个资源的情况。这对于排查程序在运行时出现的卡死或长时间无响应问题非常有用。
  • CPU 使用分析:通过查看线程的 CPU 使用情况,jstack 可以帮助您确定哪些线程消耗了大量的 CPU 资源,找出可能导致 CPU 占用过高的原因。
  • 线程状态监控:jstack 提供了对线程状态的监控,您可以了解线程的状态,如运行、阻塞、等待等,以便更好地理解应用程序的运行情况。
获取CPU飙高的进程PID

top命令用于监视 Linux 系统的实时进程和系统性能信息。那么我们可以通过top命令来实时定位到那个线程占用大量CPU资源。

输入命令:

top

服务器CPU飚高排查,笔记,踩坑,Linux,开发语言,java,linux

可以看到PID列中进程id为8066的进程CPU占用率达到了98.7%,那么我们接下来排查的就是这个进程。

定位进程中的问题线程
top -H -p PID 

该命令的作用是在 top 工具中显示指定进程ID(PID)的线程级别信息。它将以线程级别的模式显示指定进程的各个线程的详细信息。

具体解释如下:

  • -H 选项指示 top 以线程级别的模式显示信息。
  • -p pid 选项指定需要显示信息的进程ID(PID)。在这个例子中,PID 为 8066 的进程的线程信息将被显示。

服务器CPU飚高排查,笔记,踩坑,Linux,开发语言,java,linux

将PID进程号转为16进制

以上已定位具体线程pid导致CPU飙高,那么将指定pid转换为16进制,以便下一步定位具体线程问题使用。

将一个十进制的进程ID(PID)转换为十六进制格式的字符串,可以使用 printf 命令来实现。printf 命令可以根据指定的格式将数据进行格式化输出。

printf '0x%x\n' pid
定位指定线程问题
jstack pid | grep hexadecimal -A N

具体解释如下:

  • jstack pid 用于执行 jstack 命令并生成线程转储信息。
  • | 是管道符号,将 jstack 命令的输出传递给下一个命令。
  • grep hexadecimal 表示使用 grep 命令来匹配包含 "hexadecimal" 的行。
  • -A N 选项指定在匹配到的问题代码行后显示 N 行内容。

服务器CPU飚高排查,笔记,踩坑,Linux,开发语言,java,linux

那么可以很快定位到是TestController类第20行出现了问题。

那么我们看代码:

服务器CPU飚高排查,笔记,踩坑,Linux,开发语言,java,linux

arthas

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

下载
curl -O https://arthas.aliyun.com/arthas-boot.jar
运行
java -jar arthas-boot.jar --repo-mirror aliyun --use-http

服务器CPU飚高排查,笔记,踩坑,Linux,开发语言,java,linux

运行时arthas会提示用户选择哪个Jar服务,那么我们选择【1】,按1即可。

服务器CPU飚高排查,笔记,踩坑,Linux,开发语言,java,linux

开始监控。

排查占用最高的线程
thread -n 1

服务器CPU飚高排查,笔记,踩坑,Linux,开发语言,java,linux

使用arthas可以更快定位问题代码行。

更多使用技巧请参考官方文档:

Arthas文章来源地址https://www.toymoban.com/news/detail-688699.html

到了这里,关于服务器CPU飚高排查的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux 服务器 CPU 详细信息查看、物理 CPU 以及逻辑 CPU

    什么是CPU CPU: (Central Processing Unit)也称为中央处理器,主要通过内部总线,建立起芯片内各部件之间的信息传输通路 查看CPU详细信息 : 我们平常在操作Linux服务器时,如何能够知道服务器的CPU的详细信息呢 [xxx@xxx ~]#  cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 16: CPU 核心数 Intel®

    2024年01月25日
    浏览(41)
  • 阿里云服务器部署安装hadoop与elasticsearch踩坑笔记

    2023-09-12 14:00——2023.09.13 20:06 目录 00、软件版本 01、阿里云服务器部署hadoop 1.1、修改四个配置文件 1.1.1、core-site.xml 1.1.2、hdfs-site.xml 1.1.3、mapred-site.xml 1.1.4、yarn-site.xml 1.2、修改系统/etc/hosts文件与系统变量 1.2.1、修改主机名解析文件/etc/hosts 1.2.2、修改系统环境变量/etc/profil

    2024年02月08日
    浏览(23)
  • Linux 查看服务器内存、CPU 命令

    1 查看物理CPU个数:         Procs(进程) 2 查看服务器CPU内核个数 1 linux查看系统内存(硬盘) 2 查看服务器硬盘(当前文件夹下)使用率: 3 查看服务器硬盘(所有文件占用率)使用率: 1 查看内存,不带单位 2 查看内存使用情况,带单位,显示查看结果 显示的参数:       

    2024年02月15日
    浏览(41)
  • linux服务器查看cpu和内存

    cat /proc/cpuinfo | grep \\\"physical id\\\" | sort | uniq | wc -l cat /proc/cpuinfo | grep \\\"cpu cores\\\" | uniq grep processor /proc/cpuinfo|wc -l cat /proc/cpuinfo |grep MHz|uniq less /proc/cpuinfo |grep model free -m free -h

    2024年02月05日
    浏览(39)
  • 如何提升Linux服务器cpu利用率

        目录 一、安装cpulimit和相关依赖包 1. 安装cpulimit 2. 编写提升cpu利用率脚本,并执行         如何有效提升服务器器CPU利用率,可以通过自定义脚本结合cpulimit达到提升利用率和控制到目标值。 1. 安装cpulimit ##1. 安装cpulimit  yum install -y cpulimit ##2. 安装依赖包 yum -y inst

    2024年02月10日
    浏览(47)
  • linux服务器监控之内存、cpu、网络、磁盘

    一、服务器实时内存监控 1、Linux帮助命令 man:Linux下的函数手册命令,可以查看所有命令的使用方法 ls:  ls -al: ll: 2、实时监控命令 top:   能够实时监控系统的运行状态,并且可以按照cpu及内存等进行排序。            语法:top -hv|-bcHiOSs -d secs -n max -u|U user -p pid(s) -o file

    2024年02月09日
    浏览(45)
  • Linux(包括centos) 如何查看服务器内存、CPU

    CPU架构主要包括:amd64、arm32v7、arm64v8、mips64el、mips32、ppc64le和ppc32等架构。 CPU信息主要为中央处理器详细信息,包括: 架构 核心数量 处理速度 厂商名称 CPU主频 标签 … 注:不同的操作系统或者CPU架构提供的信息不一定相同。 输出: 可以通过grep命令过滤信息: lscpu是一个

    2024年02月12日
    浏览(52)
  • 命令查看Linux服务器内存、CPU、显卡、硬盘使用情况

    使用命令:free -m 大致结果类似下图: 内存占用情况 参数解释: Mem行(单位均为M): total:内存总数 used:已使用内存数 free:空闲内存数 shared:当前废弃不用 buffers:缓存内存数(Buffer) cached:缓存内舒数(Page) (-/+ buffers/cache)行: (-buffers/cache): 真正使用的内存数,指

    2024年02月04日
    浏览(52)
  • Linux:查看服务器信息,CPU、内存、系统版本、内核版本等

    还是最近工作的总结,在做一些性能验证,这就需要要根据服务器的配置综合考虑来做进一步的结论论证,废话不多说 第一种方式 第二种方式 个人偏推崇第一种方式吧,能够更明显的看到版本和一些详细信息 第一种方式 这个命令适用于所有的Linux发行版,包括Redhat、SuSE、

    2024年01月19日
    浏览(57)
  • Linux 查看服务器内存、CPU、网络等占用情况的命令

    1、查看物理CPU个数:cat  2、查看服务器CPU内核个数:cat    每个物理CPU中core的个数(即核数) 3、服务器内存使用情况:free 3.1、缓存清除 如果cached过大接近total数就需要清除缓存了,缓存清除命令:  4、查看服务器的平均负载:top top   --可以查看服务器各个进程情况 u

    2024年02月08日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包