JEP 279:改进测试失败的故障排查
概述
自动收集诊断信息,以便在测试失败和超时时用于进一步的故障排除。
目标
收集以下信息以帮助诊断测试失败和超时问题:
- 对于在测试失败或超时后仍在主机上运行的 Java 进程:
- C 和 Java 调用栈
- 核心转储(在 Windows 上为小型转储)
- 堆统计信息
- 环境信息:
- 正在运行的进程
- CPU 和 I/O 负载
- 打开的文件和套接字
- 可用磁盘空间和内存
- 最近的系统消息和事件
我们将开发一个提供此功能的库,并将该库的源代码与产品代码放在同一位置。
动机
当没有关于测试环境的信息时,要排查偶发的测试失败是很困难的。此类测试失败通常取决于测试执行顺序和并发情况,这使得重现它们变得极其困难。
描述
通过运行平台特定的命令来收集有关环境和非 Java 进程的信息。收集有关 Java 进程的信息将通过可用的诊断命令完成,这些命令被 JEP 228 大幅扩展,例如,print_vm_state
命令,它收集类似于 hs_err
文件的信息。收集到的信息将与测试结果一起存储,以供后续检查。当测试失败时,观察者将在 finishedTest
事件中收集信息。
由于测试可能会创建其他进程,因此会收集有关测试进程及其子进程的信息。为了找到这些进程,库会创建一个以原始测试进程为根的进程树。
库源代码将放置在顶层存储库的 test
目录中,并且 makefile 将更新为构建它们并将它们作为测试包的一部分进行打包。
测试
我们将安排定期测试,使用该库。当结果和测试执行变得稳定时,我们会将该库的使用扩展到其他组件。
风险与假设
- 执行某些命令时存在挂起的风险: 为了尽量减少这种风险,命令只会执行分配的时间,然后中断。
- 主机上的磁盘空间不足: 计划是归档信息,限制保存信息的数量,并在收集信息之前检查可用磁盘空间。
- 平台或主机上缺少工具: 如果某个工具在特定主机或平台上不可用,依赖于缺失工具的命令将被跳过,并且会在日志文件中添加警告消息。另一种可能的解决方案是从已知的工具存储库下载所需的工具。
- 系统资源耗尽: 某些故障可能导致不同类型系统资源(CPU、内存、磁盘空间等)的耗尽,或者由资源锁引起。由于在这种情况下无法运行命令来收集信息,因此将跳过命令执行以防止系统进一步恶化。
- 在 Java 中获取进程树: 在 Java 中获取进程树需要 JEP 102 中描述的新进程 API。使用被测试的 JDK 作为稳定的 JDK(即运行
jtreg
测试框架的 JDK)可能会干扰测试结果。为了解决这个问题,我们将开发一种替代的进程树实现。该实现将简化将此项目反向移植到 JDK 8 的过程。