2021年了,生产环境的问题你怎么解决呢?(上)

简介: 2021年了,生产环境的问题你怎么解决呢?

image.png

前言

生产环境中,我们的应用有时会挂掉或运行缓慢,而去确定根本原因是比较麻烦的一件事情。线程Dump展示了正在运行的Java进程的当前状态的快照。但是,生成的数据包含多个长文件。因此,我们需要分析Java线程Dump,并从大量不相关的信息中挖掘问题。

今天,我们就来了解下如何过滤掉无用数据以有效地诊断性能问题。此外,我们还将学习检测瓶颈甚至简单的bug。

虚拟机JVM中的线程

JVM使用线程来执行每个内部和外部操作。正如大家所知道的,GC过程有自己的线程,每一个Java应用程序中的任务也有自己的线程。

在其生命周期内,线程会经历各种状态。每个线程都有一个跟踪当前操作的执行堆栈。此外,JVM还存储了以前成功调用的所有方法。因此,可以分析整个堆栈来研究出错时应用程序发生了什么。

获取Java 线程 Dump

应用程序运行后,有多种方法可以生成用于诊断的Java线程Dump。今天,我们将使用JDK7+安装包中的两个实用程序。首先,我们将执行JVM Process Status(jps)命令来发现我们应用程序的PID进程:

[root@centos1 service]# jps
3507 jar
3525 Jps

其次,我们得到应用程序的PID。然后,我们将使用jstack捕获线程Dump。最后,我们将结果存储在文本文件中:

[root@centos1 service]# jstack -l 3507 > bam-thread-dump.txt
Java线程 Dump结构
2021-02-05 15:23:03
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.191-b12 mixed mode):
"Attach Listener" #33 daemon prio=9 os_prio=0 tid=0x00007fd6c4001000 nid=0xe5d waiting on condition [0x0000000000000000]
  java.lang.Thread.State: RUNNABLE
  Locked ownable synchronizers:
- None
"DestroyJavaVM" #32 prio=5 os_prio=0 tid=0x00007fd708009800 nid=0xdb4 waiting on condition [0x0000000000000000]
  java.lang.Thread.State: RUNNABLE
  Locked ownable synchronizers:
- None
"http-nio-8000-AsyncTimeout" #30 daemon prio=5 os_prio=0 tid=0x00007fd709895000 nid=0xdf1 waiting on condition [0x00007fd6dde79000]
  java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at org.apache.coyote.AbstractProtocol$AsyncTimeout.run(AbstractProtocol.java:1133)
at java.lang.Thread.run(Thread.java:748)
  Locked ownable synchronizers:
- None
"http-nio-8000-Acceptor-0" #29 daemon prio=5 os_prio=0 tid=0x00007fd70b7a0800 nid=0xdf0 runnable [0x00007fd6ddf7a000]
  java.lang.Thread.State: RUNNABLE
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
- locked <0x000000078ed72eb8> (a java.lang.Object)
at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:455)
at java.lang.Thread.run(Thread.java:748)
  Locked ownable synchronizers:
- None
"http-nio-8000-ClientPoller-1" #28 daemon prio=5 os_prio=0 tid=0x00007fd70b79f000 nid=0xdef runnable [0x00007fd6de07b000]
  java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
- locked <0x000000078f1c7a00> (a sun.nio.ch.Util$3)
- locked <0x000000078f1c79f0> (a java.util.Collections$UnmodifiableSet)
- locked <0x000000078f1c78d8> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
at org.apache.tomcat.util.net.NioEndpoint$Poller.run(NioEndpoint.java:796)
at java.lang.Thread.run(Thread.java:748)
  Locked ownable synchronizers:
- None
"http-nio-8000-ClientPoller-0" #27 daemon prio=5 os_prio=0 tid=0x00007fd7085b0000 nid=0xdee runnable [0x00007fd6de17c000]
  java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
- locked <0x000000078f1c6048> (a sun.nio.ch.Util$3)
- locked <0x000000078f1c6038> (a java.util.Collections$UnmodifiableSet)
- locked <0x000000078f1c5f20> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
at org.apache.tomcat.util.net.NioEndpoint$Poller.run(NioEndpoint.java:796)
at java.lang.Thread.run(Thread.java:748)
  Locked ownable synchronizers:
- None

让我们看看生成的Java线程Dump。第一行显示时间戳,第二行展示JVM信息:

2021-02-05 15:23:03
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.191-b12 mixed mode):

然后,Dump将显示线程列表。每个线程包含以下信息:

  • Name: 如果开发人员包含有意义的线程名称,它可以提供有用的信息
  • Priority (prior): 线程优先级
  • Java ID (tid): 虚拟机JVM给的唯一ID
  • Native ID (nid): 操作系统给出的唯一ID,用于提取与CPU或内存处理的相关性
  • State: 线程实际状态
  • Stack trace: 最重要的信息来源,用来观察我们的应用程序正在发生什么

我们可以从上到下看到线程快照,观察不同线程正在做什么。

从整个文件中,截取一部分内容,分析其:

"http-nio-8000-exec-1" #17 daemon prio=5 os_prio=0 tid=0x00007fd70bc75800 nid=0xde4 waiting on condition [0x00007fd6f089d000]
  java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000078edd19b8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:103)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:31)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
  Locked ownable synchronizers:
- None
目录
打赏
0
0
0
0
556
分享
相关文章
【项目场景】请求数据时测试环境比生产环境多花了1秒是怎么回事?
这是一位粉丝(谢同学)给V哥的留言,描述了他在优化系统查询时遇到的问题:测试环境优化达标,但生产环境响应时间多出1秒。通过抓包分析,发现MySQL请求和响应之间存在500毫秒的延迟,怀疑是网络传输开销。V哥给出了以下优化建议:
DataWorks操作报错合集之出现报错导致测试环境可以正常连接,但生产环境无法连接,是什么情况
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
实时计算 Flink版操作报错之程序在idea跑没问题,打包在服务器跑就一直报错,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
MaxCompute操作报错合集之在开发环境代码运行没问题,生产环境运行报错,是什么导致的
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
198 0
MaxCompute操作报错合集之提交生产环境失败,提示列已存在,该如何解决
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
什么问题会导致404?如何解决404?
什么问题会导致404?如何解决404?
maxcompute开发环境问题之同步到生产环境失败如何解决
MaxCompute开发环境是指设置和配置用于开发MaxCompute项目的本地或云端环境;本合集将指导用户如何搭建和管理MaxCompute开发环境,包括工具安装、配置和调试技巧。
生产环境出问题了,研发要不要罚钱?
生产环境出问题了,研发要不要罚钱?
162 0
项目生产环境问题如何排查
在项目的生产环境中,问题的排查是非常重要的,它可以帮助我们快速定位并解决问题,保证项目的正常运行。本文将介绍一些常见的项目生产环境问题排查方法。
790 0
糟了,生产环境数据竟然不一致,人麻了!
今天发现Mysql的主从数据库没有同步,瞬间整个人头皮发麻
583 0
糟了,生产环境数据竟然不一致,人麻了!