Java项目服务器CPU飙升问题排查

2024-09-02 07:44

本文主要是介绍Java项目服务器CPU飙升问题排查,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 目录

一.前言

二.程序日志定位

三.Mysql事务定位

四.程序代码定位

五.微服务注册异常定位

六.异常进程定位

6.1.进程的线程信息分析

6.2.进程的堆内存分析

七.总结

八.JVM分析工具推荐


一.前言

系统出现反应慢,打不开,登录不上等问题。

二.程序日志定位

通过程序日志定位,数据库连接池出现连接超时异常,排查对象转到mysql数据库。

三.Mysql事务定位

通过对mysql事务,锁的监控,发现大量事务挤压,随即排查程序代码中对事务的控制是否不合理。

四.程序代码定位

经过全局搜索代码中对事务提交和回滚的控制,没有疏漏点,并对个别逻辑进行缩小事务控制范围的的代码优化,对一些查询量较大和频繁的表增加索引,计划择时重启服务。

程序重启后,事务并没有消失,依然有挤压,随即对程序代码进行版本回退,排除近期新上线代码可能造成的影响。

五.微服务注册异常定位

在版本回退过程中,发现注册到nacos上的四个order服务,逐步”死掉”,直至order服务不可用。

并在order所在的服务器上发现,在order服务启动后,order服务CPU占用率逐步升高,程序日志无异常,进程存活。

通过分析,推断可能服务因为CPU资源占用问题向注册中心nacos心跳请求失败,注册中心把服务下线,排除掉代码中可能存在的死循环,线程阻塞的大方向后,随即对异常进程进行分析。

六.异常进程定位

6.1.进程的线程信息分析

  • top命令列出当前服务器所有进程,并按cpu占用大小排序
  • 根据第一步获取的进程号,查询进程里线程最占用cpu,使用命令:top -p 4001893 -H
  • 把线程堆栈信息dump到本地存储,使用命令:jstack  4001893 > /home/app_oper/jstack.log
  • 使用IBM的Thread and Monitor Dump Analyzer For Java 工具对线程堆栈信息分析,下载地址

在thread dump中,要留意下面几种状态 

死锁,Deadlock(重点关注) 
等待资源,Waiting on condition(重点关注) 
•  等待获取监视器,Waiting on monitor entry(重点关注) 
阻塞,Blocked(重点关注) 
•  执行中,Runnable 
•  暂停,Suspended 
•  对象等待中,Object.wait() 或 TIMED_WAITING 
•  停止,Parked 
下面有详细的例子讲这种分析,大家参考原著 
http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html 

6.2.进程的堆内存分析

可能存在内存泄漏,GC频繁执行的情况

  • 执行jmap -dump:format=b,file=/home/app_oper/heap.bin 4001893
  • 使用IBM的HeapAnalyzer工具对生成的heap.bin进行

 通过分析,发现对机构日报表的插入脚本过大。

定位到代码中,发现存在批量插入,数据量过大且组装成了单独的sql插入语句,并处在定时任务中,执行频率为5分钟。

对定时任务临时处理后重新部署上线,观察上述三种异常(事务,nacos,CPU)均未再出现。

七.总结

近期商城订单数量激增,定时任务在处理大数据量时出现性能问题,后续将对此类场景下可能存在的问题进行全面优化,排查线上问题,多使用相关工具,比如Java 命令行工具,可视化软件(HeapAnalyzer等),第三方插件(arthas,spring boot admin等),并做好日常系统巡检工作。

其他:

内存占用程序排序前10
ps aux --sort=-%mem | awk 'NR<=11{print $4,$11,$12,$13,$14,$15}'
磁盘占用文件排序前10
find . -type f -exec du -Sh {} + | sort -rh | head -n 11

八.JVM分析工具推荐

在Java开发和维护中,分析JVM性能和排查问题是非常重要的。以下是一些常用的Java虚拟机(JVM)分析工具:

1.VisualVM
        功能:VisualVM是一个多合一的JVM监控和故障排查工具。它可以用于监控JVM的性能,分析堆转储(Heap Dump)、线程转储(Thread Dump),以及执行实时的性能分析(Profiling)。
        优点:界面友好,支持插件扩展。
        适用场景:适用于调试和分析中小型Java应用程序的性能。

jdk有自带的jvisualvm

2.JConsole:
        功能:JConsole是JDK自带的Java监控和管理工具,可以通过JMX监控JVM的资源使用情况,如内存、线程、CPU等。
        优点:轻量级,适合实时监控。
        适用场景:适用于实时监控JVM的运行状态。

3.Java Mission Control (JMC):
        功能:JMC是JDK自带的高级性能分析工具,主要用于监控和分析Java应用的长时间运行情况。它包括Flight Recorder功能,可以记录JVM运行时的详细信息。
        优点:适用于长时间运行的应用程序,能够深入分析性能瓶颈。
        适用场景:适用于企业级Java应用的深度性能分析。

4.IBM Thread and Monitor Dump Analyzer (TMDA)
        功能:TMDA用于分析Java线程转储(Thread Dump)和监控转储(Monitor Dump),帮助诊断线程挂起、死锁和资源争用等问题。相同功能的工具包括ThreadDumpViewer、FastThread等
        优点:特别适用于处理IBM JVM(如OpenJ9)的转储文件。
        适用场景:适用于IBM环境下的Java应用性能调优和故障排查。

5.IBM HeapAnalyzer

IBM HeapAnalyzer 是一个专门用于分析Java堆转储文件的工具,能够帮助开发者找出内存泄漏和对象占用内存的情况。通过详细的堆结构分析,HeapAnalyzer 可以直观地展示Java对象的内存分配情况,并帮助开发人员找到潜在的内存问题。
HeapAnalyzer的主要功能:

    1.内存泄漏检测:自动识别内存泄漏对象,并提供详细的引用链分析。
    2.对象分配分析:分析对象在内存中的分布情况,帮助了解哪些对象消耗了大量内存。
    3.可视化分析:通过图形界面,直观显示堆中对象的分布、引用关系等信息,方便定位问题。

这些工具各有侧重,可以根据具体需求选择使用,以更好地分析和优化Java应用程序的性能

6.JProfiler

JProfiler是一个强大的Java应用性能分析工具,广泛用于分析Java应用程序的内存使用、CPU性能、线程行为和数据库访问等。它通过丰富的可视化界面和详细的报告,帮助开发人员优化应用性能,找出瓶颈和问题,JProfiler的主要功能:

  1. CPU分析:监控方法的执行时间,找出性能瓶颈。
  2. 内存分析:检测内存泄漏,分析对象分配和垃圾回收情况。
  3. 线程分析:监控线程状态,找出线程死锁或其他并发问题。
  4. 数据库分析:分析JDBC连接的性能,找出慢查询。

7.GCViewer:
        功能:GCViewer是一个开源工具,用于分析和可视化JVM的垃圾回收(GC)日志,帮助开发人员了解GC行为和性能。
        优点:能够直观地显示GC活动,帮助优化GC策略。
        适用场景:适用于优化JVM的垃圾回收性能。

8.Eclipse Memory Analyzer (MAT):
        功能:MAT是一个强大的内存分析工具,用于分析堆转储文件,帮助开发人员发现内存泄漏和分析内存使用情况。
        优点:能够处理大规模的堆转储文件,提供详细的内存分析报告。
        适用场景:适用于内存泄漏排查和内存使用优化。

9.Spring Boot Admin

Spring Boot Admin 是一个用于管理和监控Spring Boot应用程序的开源工具。它提供了一个简单且易于使用的界面,能够实时监控多个Spring Boot应用程序的健康状态、性能指标、日志信息等。主要功能包括:

1.应用程序监控:
监控Spring Boot应用的健康状况,包括内存使用、线程状态、垃圾回收、系统属性等。
实时查看应用程序的日志输出,帮助快速定位和解决问题。
2.告警功能:
支持配置告警规则,当应用程序出现异常或达到预设的阈值时发送通知。
通知方式支持邮件、Slack、Webhook等。
3.应用程序注册:
应用程序可以通过Spring Boot Admin的客户端库自动注册到管理界面,也可以通过手动配置进行注册。
4.用户管理:
支持多用户访问控制,不同用户可以根据权限查看不同的信息。
提供了简单的认证机制,也可以集成第三方认证服务。

其他:

  • Arthas
  • ctbots

参考:

springboot应用cpu飙升的原因排除_springboot cpu占用太高-CSDN博客

linux中java项目cpu高

java占用CPU很高,如何快速进行gc分析

MySQL执行状态查看与分析_查看mysql运行状态-CSDN博客

这篇关于Java项目服务器CPU飙升问题排查的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot自定义注解如何解决公共字段填充问题

《SpringBoot自定义注解如何解决公共字段填充问题》本文介绍了在系统开发中,如何使用AOP切面编程实现公共字段自动填充的功能,从而简化代码,通过自定义注解和切面类,可以统一处理创建时间和修改时间... 目录1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3

Windows server服务器使用blat命令行发送邮件

《Windowsserver服务器使用blat命令行发送邮件》在linux平台的命令行下可以使用mail命令来发送邮件,windows平台没有内置的命令,但可以使用开源的blat,其官方主页为ht... 目录下载blatBAT命令行示例备注总结在linux平台的命令行下可以使用mail命令来发送邮件,Win

SpringBoot基于沙箱环境实现支付宝支付教程

《SpringBoot基于沙箱环境实现支付宝支付教程》本文介绍了如何使用支付宝沙箱环境进行开发测试,包括沙箱环境的介绍、准备步骤、在SpringBoot项目中结合支付宝沙箱进行支付接口的实现与测试... 目录一、支付宝沙箱环境介绍二、沙箱环境准备2.1 注册入驻支付宝开放平台2.2 配置沙箱环境2.3 沙箱

Nginx实现高并发的项目实践

《Nginx实现高并发的项目实践》本文主要介绍了Nginx实现高并发的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用最新稳定版本的Nginx合理配置工作进程(workers)配置工作进程连接数(worker_co

使用Java发送邮件到QQ邮箱的完整指南

《使用Java发送邮件到QQ邮箱的完整指南》在现代软件开发中,邮件发送功能是一个常见的需求,无论是用户注册验证、密码重置,还是系统通知,邮件都是一种重要的通信方式,本文将详细介绍如何使用Java编写程... 目录引言1. 准备工作1.1 获取QQ邮箱的SMTP授权码1.2 添加JavaMail依赖2. 实现

Java嵌套for循环优化方案分享

《Java嵌套for循环优化方案分享》介绍了Java中嵌套for循环的优化方法,包括减少循环次数、合并循环、使用更高效的数据结构、并行处理、预处理和缓存、算法优化、尽量减少对象创建以及本地变量优化,通... 目录Java 嵌套 for 循环优化方案1. 减少循环次数2. 合并循环3. 使用更高效的数据结构4

java两个List的交集,并集方式

《java两个List的交集,并集方式》文章主要介绍了Java中两个List的交集和并集的处理方法,推荐使用Apache的CollectionUtils工具类,因为它简单且不会改变原有集合,同时,文章... 目录Java两个List的交集,并集方法一方法二方法三总结java两个List的交集,并集方法一

Spring AI集成DeepSeek三步搞定Java智能应用的详细过程

《SpringAI集成DeepSeek三步搞定Java智能应用的详细过程》本文介绍了如何使用SpringAI集成DeepSeek,一个国内顶尖的多模态大模型,SpringAI提供了一套统一的接口,简... 目录DeepSeek 介绍Spring AI 是什么?Spring AI 的主要功能包括1、环境准备2

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav