【问题标题】:Jenkins build job using 100% CPU on executorsJenkins 在执行器上使用 100% CPU 构建作业
【发布时间】:2017-05-23 22:23:40
【问题描述】:

现在,我们看到我们的 Jenkins 机器被固定在 100% 的 CPU(或 200% 或 400%,取决于内核数量),根据顶部:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                      
23376 ec2-user  20   0 4220m 100m    0 S 99.2  1.3 324945:21 java

即使在构建完成并且当前没有构建正在运行时,这些 JVM 进程仍然存在。主节点和从节点上的构建都会出现此问题。运行从代理本身的 JVM 的 CPU 使用率完全正常。

一旦我最终能够获得线程转储,就只有一个非系统线程可以运行并且没有等待锁定:

"main" #1 prio=5 os_prio=0 tid=0x00007f0834008800 nid=0x5b51 runnable [0x00007f083abf3000]
java.lang.Thread.State: RUNNABLE
at java.util.HashMap.put(HashMap.java:611)
at java.util.HashSet.add(HashSet.java:219)
at net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$Default$Key$Harmonized.detach(MethodGraph.java:878)
at net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$Default$Key$Store$Entry$Resolved.asNode(MethodGraph.java:1331)
at net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$Default$Key$Store.asGraph(MethodGraph.java:1138)
at net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$Default.compile(MethodGraph.java:507)
at net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$AbstractBase.compile(MethodGraph.java:423)
at net.bytebuddy.dynamic.scaffold.MethodRegistry$Default.prepare(MethodRegistry.java:489)
at net.bytebuddy.dynamic.scaffold.subclass.SubclassDynamqicTypeBuilder.make(SubclassDynamicTypeBuilder.java:153)
at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase$Delegator.make(DynamicType.java:2508)
at org.mockito.internal.creation.bytebuddy.MockBytecodeGenerator.generateMockClass(MockBytecodeGenerator.java:60)
at org.mockito.internal.creation.bytebuddy.CachingMockBytecodeGenerator$CachedBytecodeGenerator.generate(CachingMockBytecodeGenerator.java:72)
at org.mockito.internal.creation.bytebuddy.CachingMockBytecodeGenerator$CachedBytecodeGenerator.getOrGenerateMockClass(CachingMockBytecodeGenerator.java:64)
at org.mockito.internal.creation.bytebuddy.CachingMockBytecodeGenerator.get(CachingMockBytecodeGenerator.java:27)
at org.mockito.internal.creation.bytebuddy.ByteBuddyMockMaker.createProxyClass(ByteBuddyMockMaker.java:54)
at org.mockito.internal.creation.bytebuddy.ByteBuddyMockMaker.createMock(ByteBuddyMockMaker.java:27)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:32)
at org.mockito.internal.MockitoCore.mock(MockitoCore.java:55)
at org.mockito.Mockito.mock(Mockito.java:1449)
at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:33)
at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:16)
at org.mockito.internal.configuration.DefaultAnnotationEngine.createMockFor(DefaultAnnotationEngine.java:43)
at org.mockito.internal.configuration.DefaultAnnotationEngine.process(DefaultAnnotationEngine.java:66)
at org.mockito.internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations(InjectingAnnotationEngine.java:71)
at org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.java:55)
at org.mockito.MockitoAnnotations.initMocks(MockitoAnnotations.java:108)
at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl$1.withBefores(JUnit45AndHigherRunnerImpl.java:27)
at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:276)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37)
at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62)
at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:59)
at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:115)
at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:102)
at org.apache.maven.surefire.Surefire.run(Surefire.java:180)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:350)
at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021)

我连续进行了几次线程转储,这个线程几乎总是在完全相同的位置 - HashMap.put(HashMap.java:611) - 而那个 JVM 占用了 100% 的 CPU。发生这种情况时,我没有机会附加调试器,但我只是想看看是否有人认为这是一个已知错误。对我来说,它看起来像是某种热旋转的无限循环,它试图一遍又一遍地将一些项目添加到哈希映射中。这可能与 Jenkins 有关,但出现在堆栈跟踪中的其他主要参与者显然是 Maven Surefire、JUnit、Mockito 和 ByteBuddy(抱歉包含所有这些标签)。

我无法可靠地重现此问题,而且不幸的是,我也不知道我们的数百个构建中的哪一个留下了这些搞砸的 JVM。为了完整起见,环境是 Jenkins 2.46.1、Maven 3.3.3、Surefire 2.19.1、JUnit 4.12,但不幸的是一系列不同的 Mockito(以及因此 ByteBuddy)版本。我希望有人认识到这是其中一个相关组件中的一个已知错误,并可以提出解决方法...

【问题讨论】:

  • FWIW,在仔细检查堆栈跟踪如何与不同版本的 Mockito 中的代码对齐后,代码路径似乎建议 Mockito 2.0.44-beta (!),因此 ByteBuddy 1.2.3 .因此,这在 Mockito 的非 beta 版本中可能不再是问题......
  • 我同意:mockito 2.0 已经很久过去了。如果您因为使用 PowerMockito 而受限于该特定版本……欢迎来到痛苦的世界。这就是我们停止使用 PowerMock(ito) 的原因;而是使用最新最棒的 Mockito 版本。

标签: jenkins junit mockito maven-surefire-plugin byte-buddy


【解决方案1】:

您可以使用最新版本的 Mockito 重试吗?这似乎是我们用于模拟创建的新锁定机制的问题。以前,我们只对所有类型使用一个锁,现在锁的粒度更细了。

您看到的堆栈跟踪是在模拟创建中,Byte Buddy 构建由类定义的方法的结构。它需要这样做,以解决层次结构中的桥接方法。这是一项相当昂贵的操作,但不应无休止地旋转。您是否有具有非常深层次结构(50 多个级别)的类?

【讨论】:

  • 感谢您对这里可能发生的情况添加一些解释。我们正在升级所有仍使用 Mockito 2.0.44-beta 的项目。如果可以修复它,我将提供更新。 WRT 类层次结构深度:如果不对我们所有的代码库进行详细分析,我无法 100% 确定,但我非常怀疑我们的任何项目的层次结构深度都超过 50 级。
猜你喜欢
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 2014-04-08
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多