Linux服务器快速定时CPU占用高线程的方法

场景描述

最近遇到一个生产环境,一个程序因为代码写的有问题,导致CPU占用很高,所以需要马上排查问题,首先要先找出哪个程序,具体代码在哪里,所以需要借助jstackjmap这些命令来定位具体的线程,查看具体的线程堆栈信息

问题模拟

为了模拟生产环境问题,需要写点代码,让AI写吧,但是不要oom,只是让cpu高就行,AI写的代码,接口传一个比较大的值,比如10000

package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping(value = "/test")
public void test(@RequestParam(value = "num", defaultValue = "10000")Integer num) {
// 定义线程数量,这里设置为CPU核心数的两倍,以确保高CPU使用率
int numberOfThreads = Runtime.getRuntime().availableProcessors() * 2;
Thread[] threads = new Thread[numberOfThreads];
// 创建并启动线程
for (int i = 0; i < numberOfThreads; i++) {
threads[i] = new Thread(new IntensiveTask(num));
threads[i].start();
}
}
static class IntensiveTask implements Runnable {
private Integer num = 10000;
public IntensiveTask(Integer num) {
this.num = num;
}
@Override
public void run() {
while (true) {
// 创建一个大型数组
int[] array = new int[num];
// 使用计算密集型操作,如排序
java.util.Arrays.sort(array);
// 短暂休眠以避免完全占用CPU
try {
Thread.sleep(1);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
}
}
}
}

将代码丢到开发环境,java启动程序

nohupjava-jar demo-0.0.1-SNAPSHOT.jar > /opt/logs/output.log 2>&1&

调用接口:

curl http://127.0.0.1:8080/test?num=10000

问题处理

在window系统有任务管理器这些可视化界面可以看,在Linux服务器也有,比如top命令

定位CPU占用高的进程

在Linux服务器,可以使用top命令,其中%CPU表示cpu占用率,%MEM表示内存占用率

top

Linux服务器快速定时CPU占用高线程的方法

直接使用top来看有时候不能很直观,所以加点命令,

top-b-n1|head-n16

-b选项表示批处理模式,-n 1表示只运行一次top命令。head -n 16表示打印16行,这个行数根据具体情况加,因为我想打印出前10的进程

Linux服务器快速定时CPU占用高线程的方法

想要持续监控CPU和内存占用最高的前10个进程,加上watch命令,每1s会更新一次

watch-n1"top -b -n 1 | head -n 16"

也可以使用命令:

top-b-n1|head-n20|awk'NR>1 {print $1, $2, $9, $10, $12}'

Linux服务器快速定时CPU占用高线程的方法

定位进程中高CPU占用的线程

在前面的方法中使用top命令定位到进程后,需要再定义进程中具体的线程,可以使用命令,其中pid就是前面定位到的进程ID

top-Hp pid

比如前面定位到2540这个进程,监控一下进程下面具体的线程,发现线程2568、2569比较占cpu

Linux服务器快速定时CPU占用高线程的方法

嫌弃不够直观,直接打印一下前10,2540是进程ID

ps-mp2540-o THREAD,tid |gawk'NR!=1 && NR!=2 { printf "%s %x\n",$2,$8 }'|sort-rn|head-10

Linux服务器快速定时CPU占用高线程的方法

将线程ID转换为十六进制

将前面的线程ID转为十六进制

printf"%x\n"2569

Linux服务器快速定时CPU占用高线程的方法

获取线程堆栈信息

jstack 2540|grep"a09"-A30

通过线程堆栈信息就可以定位到具体的代码

Linux服务器快速定时CPU占用高线程的方法

找到具体问题代码,原来写了个while(true)循环

Linux服务器快速定时CPU占用高线程的方法

监控GC情况

当然生产环境的问题不一定这么容易定位,所以需要监控gc情况,使用jstat -gcutil <进程号>命令查看GC持续变化情况,如果发现Full GC次数过多,可能需要进一步分析内存使用情况

Linux服务器快速定时CPU占用高线程的方法

导出堆内存文件

如果出现频繁Full GC的问题,使用命令导出堆内存文件:

jmap -dump:format=b,file=heapdump.hprof pid

分析堆内存文件

使用MAT工具打开导出的heapdump.hprof文件,分析内存泄漏和内存分配情况,找出占用大量内存的对象

优化代码

根据MAT的分析结果,定位代码中的问题,优化代码

监控生产环境

重新部署修改后的代码,并使用top命令监控CPU占用情况,确保问题得到解决,同时可以部署一下监控平台,比如zabbix等对生产环境服务器进行监控,及时发现问题

以上就是Linux服务器如何快速定时CPU占用高的线程的详细内容,更多相关资料请阅读主机测评网其它文章!

原创文章,作者:admin,如若转载,请注明出处:https://hostingchat.cn/3117.html

(0)
admin的头像admin
上一篇 2025年8月16日 上午12:00
下一篇 2025年8月19日 上午12:00

相关推荐

  • EXT2、EXT3、EXT4、XFS、GPT详解

    EXT2与EXT3区别 Linux之前缺省情况下使用的文件系统为Ext2,ext2文件系统的确高效稳定。但是,随着Linux系统在关键业务中的应用,Linux文件系统的弱点也渐渐显…

    2017年12月14日
    000
  • Linux中常见环境变量的特点与设置指南

    前言 环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息。理解环境变量对于系统管理、软件开发都很重要。 一、环境变量的概念 环境变量是操作系统用来存储和传递与系…

    2025年7月30日
    000
  • Linux服务器添加SWAP分区

    SWAP分区简介 Swap分区在系统的物理内存不够用的时候,把物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被…

    2017年12月25日
    000
  • Linux的/etc/fstab文件详解

    一、/etc/fstab文件的作用 /etc/fstab是用来存放文件系统的静态信息的文件。位于/etc/目录下,可以用命令less /etc/fstab来查看,如果要修改的话,则…

    2022年8月23日
    000
  • Linux终端小工具tldr

    在终端上使用各种命令执行重要任务是 Linux 桌面体验中不可或缺的一部分。Linux 这个开源操作系统拥有丰富的命令,任何用户都无法全部记住所有这些命令。而使事情变得更复杂的是,…

    2019年7月23日
    000
  • Linux中配置Java环境变量的图文教程

    基本工作 1.官网下载java 1.8地址(需要注册一个oracle账户): Java Downloads | Oracle 点击上面的链接,滚动页面到最下面就可以看到下载界面,如…

    2025年6月10日
    000
  • linux 详解useradd 命令基本用法

    linux 详解useradd 命令基本用法 概要: 在 Linux 中 useradd 是个很基本的命令,但是使用起来却很不直观。以至于在 Ubuntu 中居然添加了一个 add…

    2024年6月7日
    000
  • 光速!搜索、学习和实践 Linux 命令!!

    这一标题可能看起来很粗略且吸睛。请允许我解释一下我在本教程中将要阐释的内容。假设你想下载一个压缩文件,将其解压缩,并从命令行中将文件从一个位置移动到另一个位置。根据上面的场景,我们…

    2024年6月19日
    000
  • Linux快速清空大文件

    1、通过重定向到null清空文件内容 使用shell重定向null(不存在的对象)到文件的最简单方法来清空文件内容 [root@localhost ~]# > access.…

    2022年8月23日
    000
  • LINUX安全设置之关于GRUB加密图文教程全解

    关于LINUX的启动装载程序GRUB加密,算是一件很平常的工作。但是今天我在网上查这个东西,发现好多人都写的很简单,而且方法都比较过时。所以,在此我更新下GRUB加密。和大家分享下…

    2024年8月9日
    000

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注