Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Linux服务器如何快速定时CPU占用高的线程_创想鸟

Linux服务器如何快速定时CPU占用高的线程

场景描述

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

问题模拟

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

代码语言:javascript代码运行次数:0运行复制

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;@RestControllerpublic 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启动程序

代码语言:javascript代码运行次数:0运行复制

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

调用接口:

代码语言:javascript代码运行次数:0运行复制

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

问题处理

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

定位CPU占用高的进程 在Linux服务器,可以使用top命令,其中%CPU表示cpu占用率,%MEM表示内存占用率代码语言:javascript代码运行次数:0运行复制

top
Linux服务器如何快速定时CPU占用高的线程

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

代码语言:javascript代码运行次数:0运行复制

top -b -n 1 | head -n 16

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

Linux服务器如何快速定时CPU占用高的线程

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

Poixe AI Poixe AI

统一的 LLM API 服务平台,访问各种免费大模型

Poixe AI 75 查看详情 Poixe AI 代码语言:javascript代码运行次数:0运行复制

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

也可以使用命令:

代码语言:javascript代码运行次数:0运行复制

top -b -n 1 | head -n 20 | awk 'NR>1 {print $1, $2, $9, $10, $12}'
Linux服务器如何快速定时CPU占用高的线程

定位进程中高CPU占用的线程 在前面的方法中使用top命令定位到进程后,需要再定义进程中具体的线程,可以使用命令,其中pid就是前面定位到的进程ID代码语言:javascript代码运行次数:0运行复制

top -Hp pid

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

Linux服务器如何快速定时CPU占用高的线程

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

代码语言:javascript代码运行次数:0运行复制

ps -mp 2540 -o THREAD,tid | gawk 'NR!=1 && NR!=2 { printf "%s %xn",$2,$8 }' | sort -rn | head -10
Linux服务器如何快速定时CPU占用高的线程

将线程ID转换为十六进制 将前面的线程ID转为十六进制代码语言:javascript代码运行次数:0运行复制

printf "%xn" 2569
Linux服务器如何快速定时CPU占用高的线程

获取线程堆栈信息代码语言:javascript代码运行次数:0运行复制

jstack 2540 | grep "a09" -A 30

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

Linux服务器如何快速定时CPU占用高的线程

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

Linux服务器如何快速定时CPU占用高的线程

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

Linux服务器如何快速定时CPU占用高的线程

导出堆内存文件 如果出现频繁Full GC的问题,使用命令导出堆内存文件:代码语言:javascript代码运行次数:0运行复制

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

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

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

监控生产环境

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

以上就是Linux服务器如何快速定时CPU占用高的线程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/729081.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月25日 10:47:02
百度网盘app怎样上传视频文件
下一篇 2025年11月25日 10:47:09

相关推荐

发表回复

登录后才能评论
关注微信