首页 > 解决方案 > 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());
            }

        }

谢谢, 比贝克

标签: jenkinsjmeterxml-parsingout-of-memory

解决方案


  1. 您需要为 JMeter 而不是为 Jenkins 增加堆,请查看如何向 Jenkins 添加 Java 参数?文章的说明。
  2. 您可能想要切换到XMLSlurper 或 XMLParser,它们都是基于SAX的,因此内存占用应该更少。
  3. 根据JMeter Best Practices你应该使用 JMeter 结果文件的 CSV 输出格式,如果你需要计算通过的请求的数量,你可以使用JMeterPluginsCMD 命令行工具

推荐阅读