性能分析(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 线程栈的信息,可以发现是某一行代码的问题
相关文章
|
2月前
|
SQL 监控 关系型数据库
【紧急救援】MySQL CPU 100%!一套组合拳教你快速定位并解决!
凌晨三点MySQL CPU飙至100%,业务瘫痪!本文亲历30分钟应急排障全过程:从紧急止血、定位慢查询、分析锁争用,到优化SQL与索引,最终恢复服务。总结一套可复用的排查路径与预防方案,助你告别深夜救火。
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
189 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
213 1
|
8月前
|
监控 Java Unix
6个Java 工具,轻松分析定位 JVM 问题 !
本文介绍了如何使用 JDK 自带工具查看和分析 JVM 的运行情况。通过编写一段测试代码(启动 10 个死循环线程,分配大量内存),结合常用工具如 `jps`、`jinfo`、`jstat`、`jstack`、`jvisualvm` 和 `jcmd` 等,详细展示了 JVM 参数配置、内存使用、线程状态及 GC 情况的监控方法。同时指出了一些常见问题,例如参数设置错误导致的内存异常,并通过实例说明了如何排查和解决。最后附上了官方文档链接,方便进一步学习。
1124 4
|
5月前
|
Arthas 监控 Java
Java死锁 如何定位?如何避免Java死锁?(图解+秒懂+史上最全)
Java死锁 如何定位?如何避免Java死锁?(图解+秒懂+史上最全)
Java死锁 如何定位?如何避免Java死锁?(图解+秒懂+史上最全)
|
7月前
|
搜索推荐 Java 定位技术
Java实现利用GeoLite2-City.mmdb根据IP定位城市的方法
在城市,国家,地区等地理位置数据获取之后,你可以依指定的业务需求,来进行进一步的数据处理。例如,你可以设计一个应用,根据用户的 IP 地址来个性化地展示内容,或者用于分析网络请求的来源等。
1322 20
|
11月前
|
存储 设计模式 监控
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
1063 166
|
8月前
|
监控 C#
【Function App】如果一个拥有多个Function App的Plan遇见了High CPU问题? 如何方便定位是哪一个Function App引发的呢?
在Azure Function App测试中,若多个Function App共用同一App Service Plan资源,当出现High CPU问题时,由于Function App公开指标无法直接观测CPU状态,可通过启用Application Insights解决。其Live Metrics功能可过滤并查看每个Function App的CPU使用情况。具体步骤为:将所有Function App连接至同一Application Insights资源,进入Live Metrics页面按Role筛选监控数据。附有三段C#代码示例,分别展示占用CPU、Memory及普通功能的实现方法。
232 36
|
9月前
|
存储 设计模式 监控
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
269 0
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
|
Java 对象存储 开发者
如何找出Java进程占用CPU高的元凶
本文记录了一次Java进程CPU占用率过高的问题和排查思路。