生产环境发生 cpu 飙高的问题解决

2024-01-30 21:40

本文主要是介绍生产环境发生 cpu 飙高的问题解决,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

常见的cpu飙高原因:

  1. CAS 自旋一直重试导致 cpu 飙高 没有控制自旋次数;乐观锁
  2. 死循环;
  3. 云上 Redis 被注入挖矿程序,建议 Redis 端口不要能够被外网访问;
  4. 服务器被 DDOS 工具导致 cpu 飙高,可以通过限流、ip 黑名单、图形验证码防止机器模拟攻击。

由此我们知道在发生这类问题其解决关键就是找到发生cpu飙升的进程-->通过进程找到占用率最高的线程-->通过该线程找到对应的业务逻辑从而优化代码解决。固使用到线程池建议配置线程池名称方便后期维护。

首先我们先看看windows环境下的解决方法:

我们先运行一段测试代码模拟cpu飙高的问题场景

public class CeshiTest {public static void main(String[] args) {new Thread(() -> {while(true){System.out.println("跑代码中......");}},"thread-test-1").start();}
}

接着我们运行代码后打开任务管理器查看cpu使用率运行前后对比:

 前:

 后:

 我们发现cpu占用率明显飙升。随后我们打开jdk自带的一款性能分析和故障排除工具jvisualvm

工具路径在jdk安装路径下的(C:\Program Files\Java\jdk1.8.0_162\bin\jvisualvm.exe)

打开后找到我们运行的进程:

 接着在找到该进程的抽样器中查看cpu使用时间占比最高的线程

 我们很快找到了问题的根源之后再去查看该线程对应的业务逻辑即可

我们再看看再linux环境下如何排查

 首先我们再linux中启动刚刚的测试代码

然后执行命令 top -c 在服务器上cpu占用较高的进程:

一研就找到了我们运行的测试代码进程,之后在对这一进程进行进一步排查,在这之前先介绍一款一款线上监控诊断工具Arthas(阿尔萨斯)

我们先通过命令下载该工具jar包在将jar启动起来:

curl -O https://arthas.aliyun.com/arthas-boot.jarjava -jar arthas-boot.jar

 

 此时让我们选择要监控的进程,因为我们查到【2】出现问题,所以选择监控【2】就好了

 看到这代表启动成功并且监控我们正在运行的进程

然后我们在通过指令 thread -n 5 查看线程中cpu占用最多的5条线程:

 由此我们也定位到了问题所在。

分析思路:

  1. 查看当前的操作系统中(top) 那个进程 cpu 使用率是最高的;
  2. 找到该操作系统中 最高使用率 进程 分析该进程里面具体线程 谁 cpu 使用率是最高 的
  3. 在根据线程名称 搜索“java 代码” 找到具体发生 cpu 飙高的代码 工具:使用 jvisualvmq.exe或者Arthas 工具

 注意:在企业真实环境中一般都会为自家项目开发一个服务器监控系统,并为服务器cup占用设置一个阈值(70%—85%),超过阈值就会报警通知运维人员,运维人员在查找到cpu飙升的服务器节点通知开发人员排查问题以防止挂掉。

这篇关于生产环境发生 cpu 飙高的问题解决的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/661638

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”