性能分析(1)- Java 进程导致 CPU 使用率升高,问题怎么定位?

简介: 性能分析(1)- Java 进程导致 CPU 使用率升高,问题怎么定位?

性能分析小案例系列,可以通过下面链接查看哦

https://www.cnblogs.com/poloyy/category/1814570.html

ps:这些分析小案例不能保证完全准确哦,是博主学习过程中的总结,仅做参考

 

前提


本机有一个很占用 CPU 的项目,放在了 Tomcat 下启动着

image.png

如何定位


Jmeter 聚合报告

image.png

  • 可以看到平均响应时间不断的上升,但是吞吐量(TPS)很低
  • 平均响应时间一般超过 1s,就要排除网络有没有瓶颈

 

排查网络是否有瓶颈

在 cmd ping 自己的服务器 ip 地址,看是否有很大的延时或丢包

image.png

可以看到,没有丢包,而且延时也很低,证明网络没有问题

 

在服务器中,通过 top 查看是否有进程的用户态(us)过高

top

image.png

  • 可以看到是 Java 进程导致 CPU 使用率贼高,已经占满了四个 CPU
  • 记住该进程 PID

 

通过 ps 命令确认具体是哪个进程

ps -aux | grep2838

image.png

很明显,就是我们 Java 程序所在的 Tomcat 进程啦

 

通过 top 查看 Java 进程的线程执行情况

2838 是进程 id 哦(pid)

top -Hp 2838

image.png

  • 上面的 PID 就是线程的 PID
  • 按照线程的 CPU 使用率从高到低排序

 

将排在前面的线程 PID 转换成十六进制

printf "%x\n"4808

image.png

打印 Java 线程栈的信息

jstack 2838 | grep 12c8 -A30

  • 2838:java 进程
  • 12c8:线程十六进制
  • -A30:打印 30 行

image.png

  • 包含:包名、类名、代码行信息,可以快速定位到某行代码导致该线程 CPU 使用率过高
  • jstack:JDK 自带命令

 

分析思路过程

  • 使用 Jmeter 进行压测,通过观察聚合报告,发现 TPS 很低只有2.几,但是响应时间很高
  • 响应时间很高首先要排查是否是网路原因,通过 ping 服务器的 IP 发现延时很低,不存在网络问题
  • 通过 top 查看服务端的系统资源情况,发现用户态 CPU 使用率比较高,即存在占用 CPU 高的进程,查看进程列表,发现一个 Java 进程的 CPU 占用率特别高
  • 通过 ps 命令确认该进程的详细信息
  • 通过 top -Hp 查看该进程的所有线程信息
  • 将排在前面的 Java 线程号打印成 16 进制字符串
  • 通过 jstack 打印 Java 线程栈的信息,可以发现是某一行代码的问题
相关文章
|
4月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
260 1
|
4月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
269 1
|
10月前
|
缓存 运维 前端开发
快速定位进程性能瓶颈
这篇文章详细介绍了进程热点追踪的概念、业务痛点、解决方案以及实际案例分析,旨在帮助开发者和运维人员快速定位和解决系统性能瓶颈问题。
快速定位进程性能瓶颈
|
Java 对象存储 开发者
如何找出Java进程占用CPU高的元凶
本文记录了一次Java进程CPU占用率过高的问题和排查思路。
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
188 1
|
Java 关系型数据库 MySQL
java控制Windows进程,服务管理器项目
本文介绍了如何使用Java的`Runtime`和`Process`类来控制Windows进程,包括执行命令、读取进程输出和错误流以及等待进程完成,并提供了一个简单的服务管理器项目示例。
268 1
|
运维 监控 Java
使用jps命令查看Java进程
`jps`是Java开发者和系统管理员的得力助手,它简化了Java进程监控的过程,使得快速检查应用运行状态变得轻而易举。通过合理利用其提供的参数,可以高效地进行故障排查、性能监控及日常管理任务,确保Java应用稳定运行。
1422 2
|
存储 监控
【Azure Cloud Service】在Azure云服务中收集CPU监控指标和IIS进程的DUMP方法
在使用Cloud Service服务时,发现服务的CPU占用很高,在业务请求并不大的情况下,需要直到到底是什么进程占用了大量的CPU资源,已经如何获取IIS进程(w3wp.exe)的DUMP文件?
200 8
|
C# 开发者 数据处理
WPF开发者必备秘籍:深度解析数据网格最佳实践,轻松玩转数据展示与编辑大揭秘!
【8月更文挑战第31天】数据网格控件是WPF应用程序中展示和编辑数据的关键组件,提供排序、筛选等功能,显著提升用户体验。本文探讨WPF中数据网格的最佳实践,通过DevExpress DataGrid示例介绍其集成方法,包括添加引用、定义数据模型及XAML配置。通过遵循数据绑定、性能优化、自定义列等最佳实践,可大幅提升数据处理效率和用户体验。
256 0
|
消息中间件 算法 Java
深入浅出操作系统:进程管理的艺术掌握Java中的异常处理机制
【8月更文挑战第30天】在数字世界的舞台上,操作系统扮演着导演的角色,精心安排着每一个进程的表演。本文将揭开进程管理的神秘面纱,从进程的诞生到终结,探究它们如何在操作系统的指挥下和谐共舞。通过生动的比喻和直观的代码示例,我们将一同走进操作系统的核心,理解进程调度、同步与通信的内在机制,以及它们对计算生态的重要性。让我们跟随代码的节奏,一起感受操作系统的魅力吧!