AEM 线程转储分析

上次更新: 2023-04-13

描述

环境

Adobe Experience Manager

问题

使用分析AEM Java线程转储 IBM线程分析器 工具和最佳实践。

解决方法

按照以下步骤和最佳实践,使用 IBM线程分析器 工具:

  1. 下载并安装 IBM线程分析器 (简称IBMTDA)。

  2. 从遇到性能问题的 AEM 实例中捕获线程转储

  3. 在 IBM TDA 中打开线程转储。

  4. 要查看线程转储的详细信息,请在列表中选择文件,然后单击 线程详细信息 按钮。

    tda-threaddetail
  5. 排序依据 堆栈深度 最长的书库。

    tda-image1

  6. 查看堆栈深度为 10 行或更长的线程。 这些通常是人们最感兴趣的线程。

    对感兴趣的线程进行注释。

  7. 按线程排序 .

  8. 向下滚动到 Runnable 线程。 可运行线程是在进行线程转储时大量占用 CPU 时间的线程。

    注意:在审核 Runnable 线程,可以忽略 可忽略的线程 部分。

  9. 查找属于应用程序一部分的可运行线程,例如后台作业线程或请求线程(请求线程具有如下名称 —  127.0.0.1 1347028187737GET/content/sites/global/en/sitemap.static-delivery.httpd.html HTTP/1.1)。

    找到后,请一一单击这些线程。

  10. 对于每个请求线程,您可以通过查看线程名称中的时间戳来了解用户的浏览器何时向服务器发出请求。

    例如,在上述线程名称中,时间戳(以毫秒unix纪元格式)为 1347028187737.

    我们可以使用 www.epochconverter.com.

    每个线程转储都显示执行该转储的日期和时间。

    您可以利用请求时间和线程转储时间之间的时间差,查看请求处于活动状态的时长。

  11. 查看请求线程后,滚动浏览另一个 Runnable 线程。

    找到可运行的目标线程后,查看中间面板, 等待线程.

    列出的线程正在等待所选线程释放监视器。

    如果您没有看到任何等待线程,则您选择的线程仍可能是  (请参阅实施类  )。

    例如,使用 ReentrantReadWriteLock 当锁在内部实施多个显示器时,您无法判断哪个线程是锁持器。

    因此,您可能需要查看源代码,以将其与可能是锁持器的线程进行匹配。

  12. 如果线程具有锁定或监视许多其他线程正在等待的,则请查看线程转储的其余部分,以查看您是否可以找到存在相同问题的其他线程。

    查看同一线程是否仍存在于其他转储中(在IBM TDA中,您可以选择多个线程转储,然后单击 比较线程 按钮以查看线程在多个线程转储中的状态。

    tda-comparethreads

  13. 请参阅 收集器服务 在以下屏幕截图中:

    tda-Image2

  14. 在此视图中,您可以跨多个线程转储查看线程,看看它是否是长时间运行的线程。

    基本上,如果线程位于 Runnable 状态,且堆栈较长,这通常意味着它是一个长时间运行的线程。

  15. 如果你没怎么看 Runnable 线程,然后返回到线程列表,选择线程转储,然后单击 监视器详细信息 按钮。

IBM TDA 将打开一个窗口,显示拥有线程及相应等待线程的监测器的树视图。

注意:它可能显示一些线程池线程(如servlet引擎线程池监视器),空闲线程可能被忽略。

通常可以判断线程是空闲线程池线程,因为大多数情况下它们只有10条或更少的堆栈行。

tda-monitordetail

线程级CPU利用率(仅限Linux平台):

  1. 如果您捕获 top -H -b -n1 -p javapid 输出除线程转储之外,您还可以交叉引用线程级CPU利用率。

    打开顶部输出并获取正在利用CPU的线程的进程ID。

    将进程ID转换为十六进制值,然后在相应线程转储文件中搜索该十六进制值。

    ID应与 nid 其中一条线。

  2. 如果使用最多CPU的匹配线程是 虚拟机线程 或任何 GC 线程,则可能会出现内存问题。

    对更多线程转储和顶部输出重复相同的练习,如果这些线程的模式占用CPU时间,则会出现内存问题。

  3. 如果您已确认内存问题,则请在下次出现问题时捕获堆转储。

    请参阅 分析内存问题一文 有关捕获和分析堆转储的更多详细信息。

可忽略的线程:

  • VM 线程:这是一个 VM 系统线程。
  • 以 GC 任务线程开头的线程:这些是垃圾收集线程。
  • 名称类似于 - 1347028691218 in code at java.net.PlainSocketImpl.socketAccept(Native Method):这些是Servlet引擎线程池中的线程,等待新连接。

在此页面上