jenkins - Jenkins在运行多个jmeter脚本时出现内存不足错误
问题描述
我有一个用于 API 测试的 Jmeter/Jenkins/maven/perforce 框架。每个 JMX 包含大约 200 个测试用例。每个测试用例都写在一个线程组中,只有一个用户。每个测试用例都有一些先决条件,用于从多个 dbs 获取数据,然后加热请求,然后使用 bean shell 使用多个断言。此外,我们使用了很多自定义 jar,以便我们可以访问服务器并读取日志或编辑属性文件在那边。
如果我们从 jmeter 运行脚本,它运行顺利,但如果我们从 Jenkins 运行脚本,按顺序一次说 20 jmx,那么一段时间后它可能是 1 2 或 17 小时,它无法显示内存不足错误。
我当前的 Jenkins 服务器配置是这样的:
free -h
total used free shared buff/cache available
Mem:
31G 3.1G 12.9G 16M 15G 24G
我已经用 6/8 ,12/12 之类的堆空间进行了调整。
失败时的日志:
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:90)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
at java.lang.reflect.Method.invoke(Method.java:508)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:297)
at java.lang.Thread.run(Thread.java:811)
Caused by: java.lang.OutOfMemoryError: Java heap space
at org.apache.xerces.xni.XMLString.toString(Unknown Source)
at org.apache.xerces.parsers.AbstractDOMParser.characters(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.handleCharacter(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEntityReference(Unknown Source)
at <unknown class>.<unknown method>(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
at utils.APIReportProcessing.fetchAPIReportDetail(APIReportProcessing.java:84)
at jmeterRun.RunProcess.prepareFinalResults(RunProcess.java:179)
at jmeterRun.RunProcess.executeJMeterAndWriteResults(RunProcess.java:158)
at jmeterRun.ControllerJMeter.main(ControllerJMeter.java:115)
... 6 more
这是来自 APIReportProcessing 部分的代码,它失败了。
下面是我收到错误的代码。
public static void fetchAPIReportDetail(String rawXMLReportFile) {
File rawXMLReport = null;
try {
rawXMLReport = new File(rawXMLReportFile);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(rawXMLReport);
doc.getDocumentElement().normalize();
individualModuleCount.add(passCount + "," + totalTestCount);
} catch (Exception var13) {
var13.printStackTrace();
Logging.log("info", "Error in fetching up data from XML file. Exception:" + var13.getMessage());
} finally {
try {
rawXMLReport.delete();
} catch (Exception var12) {
var12.printStackTrace();
Logging.log("error", "Error in deleting XML data file. Exception:" + var12.getMessage());
}
}
谢谢, 比贝克
解决方案
- 您需要为 JMeter 而不是为 Jenkins 增加堆,请查看如何向 Jenkins 添加 Java 参数?文章的说明。
- 您可能想要切换到XMLSlurper 或 XMLParser,它们都是基于SAX的,因此内存占用应该更少。
- 根据JMeter Best Practices你应该使用 JMeter 结果文件的 CSV 输出格式,如果你需要计算通过的请求的数量,你可以使用JMeterPluginsCMD 命令行工具
推荐阅读
- jquery - 获取文本文件时ajax缓存错误是否有效?
- sql-server - SQL Server:创建一个表,其中列是一行 - 索引 mod x
- apache-camel - AggregationStrategy 一直警告超时
- scala - 如何将每条 RDD 行与其他行进行比较?火花斯卡拉
- r - R; ggplot2:将 1 个图与另一个图重叠
- reactjs - React - 通过触发另一个组件中的事件来渲染一个组件
- java - 返回两个不同数组中的两个元素相差 2 或更少但不相等的次数的计数
- excel - Excel > 从 COUNTIFS 中排除命名范围
- vue.js - 在父组件中使用 v-if 和在子组件的根中使用 v-if 有区别吗?
- vue.js - Axios Pre-flight 请求正在获取 Access-Control-Allow-Origin 但是错误说标头不存在