性能分析(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 线程栈的信息,可以发现是某一行代码的问题
相关文章
|
7月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
385 1
|
7月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
361 1
|
10月前
|
Arthas 监控 Java
Java死锁 如何定位?如何避免Java死锁?(图解+秒懂+史上最全)
Java死锁 如何定位?如何避免Java死锁?(图解+秒懂+史上最全)
Java死锁 如何定位?如何避免Java死锁?(图解+秒懂+史上最全)
|
搜索推荐 Java 定位技术
Java实现利用GeoLite2-City.mmdb根据IP定位城市的方法
在城市,国家,地区等地理位置数据获取之后,你可以依指定的业务需求,来进行进一步的数据处理。例如,你可以设计一个应用,根据用户的 IP 地址来个性化地展示内容,或者用于分析网络请求的来源等。
2144 20
|
监控 Java Unix
6个Java 工具,轻松分析定位 JVM 问题 !
本文介绍了如何使用 JDK 自带工具查看和分析 JVM 的运行情况。通过编写一段测试代码(启动 10 个死循环线程,分配大量内存),结合常用工具如 `jps`、`jinfo`、`jstat`、`jstack`、`jvisualvm` 和 `jcmd` 等,详细展示了 JVM 参数配置、内存使用、线程状态及 GC 情况的监控方法。同时指出了一些常见问题,例如参数设置错误导致的内存异常,并通过实例说明了如何排查和解决。最后附上了官方文档链接,方便进一步学习。
2970 4
|
Java 对象存储 开发者
如何找出Java进程占用CPU高的元凶
本文记录了一次Java进程CPU占用率过高的问题和排查思路。
|
监控 算法 Java
jvm-48-java 变更导致压测应用性能下降,如何分析定位原因?
【11月更文挑战第17天】当JVM相关变更导致压测应用性能下降时,可通过检查变更内容(如JVM参数、Java版本、代码变更)、收集性能监控数据(使用JVM监控工具、应用性能监控工具、系统资源监控)、分析垃圾回收情况(GC日志分析、内存泄漏检查)、分析线程和锁(线程状态分析、锁竞争分析)及分析代码执行路径(使用代码性能分析工具、代码审查)等步骤来定位和解决问题。
357 6
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
221 1
|
Java
Java面试题之cpu占用率100%,进行定位和解决
这篇文章介绍了如何定位和解决Java服务中CPU占用率过高的问题,包括使用top命令找到高CPU占用的进程和线程,以及使用jstack工具获取堆栈信息来确定问题代码位置的步骤。
1694 0
Java面试题之cpu占用率100%,进行定位和解决
|
Java 关系型数据库 MySQL
java控制Windows进程,服务管理器项目
本文介绍了如何使用Java的`Runtime`和`Process`类来控制Windows进程,包括执行命令、读取进程输出和错误流以及等待进程完成,并提供了一个简单的服务管理器项目示例。
314 1