问题
测试1W并发时报错:
java.lang.OutOfMemoryError: Java heap space
定位过程
我是K8S部署的Jmeter,不是单机版的,没法在pod里修改配置后重启jmeter来解决此问题
解决方法
这是在Kubernetes 下部署 Jmeter 集群参考的文章和资料:
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了!