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