K8S-JMeter内存溢出

423 阅读1分钟

问题

测试1W并发时报错:

java.lang.OutOfMemoryError: Java heap space

定位过程

www.cnblogs.com/lizm166/p/1…

image.png

我是K8S部署的Jmeter,不是单机版的,没法在pod里修改配置后重启jmeter来解决此问题

解决方法

这是在Kubernetes 下部署 Jmeter 集群参考的文章和资料:

github.com/zuozewei/bl…

cloud.tencent.com/developer/a…

Step1:

进入容器,查找jmeter.bat文件,在/jmeter/apache-jmeter-5.2.1/bin/路径下,那我只需要拷贝出来,修改下Xms和Xmx,Dockerfile最后添加COPY修改后的jmeter.bat文件到/jmeter/apache-jmeter-5.2.1/bin/路径的一层就行了。

FROM xxx原来的镜像
COPY ./jmeter.bat /jmeter/apache-jmeter-5.2.1/bin/

记得同步修改jmeter-master的deployment.yaml配置文件里的resources到合理值。

测试后还是不行

Step2:

jmeter的java进程是可以通过如下命令启动的

java $JVM_ARGS $JMETER_OPTS -Xms1G -Xmx5G -XX:MaxPermSize-512m -jar "$PRGDIR/ApacheJMeter.jar" "$@" 

我们来看看测试具体执行的命令

sh /load_test /xxxxxx.jmx

查看load_test脚本

#!/bin/bash
#Script created to invoke jmeter test script with the slave POD IP addresses
#Script should be run like: ./load_test "path to the test script in jmx format"
/jmeter/apache-jmeter-*/bin/jmeter -n -t $1 `getent ahostsv4 jmeter-slaves-svc | cut -d' ' -f1 | sort -u | awk -v ORS=, '{print $1}' | sed 's/,$//'`

查看/jmeter/apache-jmeter-*/bin/jmeter

# This is the base heap size -- you may increase or decrease it to fit your
# system's memory availability:
: "${HEAP:="-Xms10g -Xmx10g -XX:MaxMetaspaceSize=2560m"}"

if [ -z "${JMETER_COMPLETE_ARGS}" ]; then
    ARGS="$JAVA9_OPTS $SERVER $DUMP $HEAP $VERBOSE_GC $GC_ALGO $SYSTEM_PROPS $JMETER_LANGUAGE $RUN_IN_DOCKER"
else
    ARGS=""
fi

"$JAVA_HOME/bin/java" $ARGS $JVM_ARGS $JMETER_OPTS -jar "$PRGDIR/ApacheJMeter.jar" "$@"

这里学习一个shell中冒号的一种用途:默认参数

: ${VAR:=DEFAULT}

当变量VAR没有声明或者为NULL时,将VAR设置为默认值DEFAULT。如果不在前面加上:命令,那么就会把${VAR:=DEFAULT}本身当做一个命令来执行,报错是肯定的。

好吧,应该脚本到这儿还没有配置过HEAP,这边的默认配置生效了。 修改/jmeter/apache-jmeter-5.2.1/bin/jmeter的HEAP配置,重新制作镜像。

FROM xxx原来的镜像
COPY ./jmeter /jmeter/apache-jmeter-5.2.1/bin/

这次终于ok了!