JMeter版本指定为jmeter5.1.1时,使用了最新的jdk17,在window机器上,运行脚本正常,但是切换到Linux确保异常,日志如下:
查看jmeter.log内容,可以发现详细报错为:
java.lang.ExceptionInInitializerError: null
at com.thoughtworks.xstream.XStream.setupConverters(XStream.java:990) ~[xstream-1.4.11.jar:1.4.11]
at com.thoughtworks.xstream.XStream.<init>(XStream.java:593) ~[xstream-1.4.11.jar:1.4.11]
at com.thoughtworks.xstream.XStream.<init>(XStream.java:515) ~[xstream-1.4.11.jar:1.4.11]
at com.thoughtworks.xstream.XStream.<init>(XStream.java:484) ~[xstream-1.4.11.jar:1.4.11]
at com.thoughtworks.xstream.XStream.<init>(XStream.java:430) ~[xstream-1.4.11.jar:1.4.11]
at com.thoughtworks.xstream.XStream.<init>(XStream.java:383) ~[xstream-1.4.11.jar:1.4.11]
at org.apache.jmeter.save.SaveService$XStreamWrapper.<init>(SaveService.java:83) ~[ApacheJMeter_core.jar:5.1.1 r1855137]
at org.apache.jmeter.save.SaveService$XStreamWrapper.<init>(SaveService.java:81) ~[ApacheJMeter_core.jar:5.1.1 r1855137]
at org.apache.jmeter.save.SaveService.<clinit>(SaveService.java:114) ~[ApacheJMeter_core.jar:5.1.1 r1855137]
at org.apache.jmeter.JMeter.runNonGui(JMeter.java:1004) ~[ApacheJMeter_core.jar:5.1.1 r1855137]
at org.apache.jmeter.JMeter.startNonGui(JMeter.java:991) ~[ApacheJMeter_core.jar:5.1.1 r1855137]
at org.apache.jmeter.JMeter.start(JMeter.java:563) [ApacheJMeter_core.jar:5.1.1 r1855137]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
at org.apache.jmeter.NewDriver.main(NewDriver.java:253) [ApacheJMeter.jar:5.1.1 r1855137]
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.util.Comparator java.util.TreeMap.comparator accessible: module java.base does not "opens java.util" to unnamed module @3d0f8e03
at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) ~[?:?]
at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) ~[?:?]
at java.lang.reflect.Field.checkCanSetAccessible(Field.java:178) ~[?:?]
at java.lang.reflect.Field.setAccessible(Field.java:172) ~[?:?]
at com.thoughtworks.xstream.core.util.Fields.locate(Fields.java:40) ~[xstream-1.4.11.jar:1.4.11]
at com.thoughtworks.xstream.converters.collections.TreeMapConverter.<clinit>(TreeMapConverter.java:50) ~[xstream-1.4.11.jar:1.4.11]
... 17 more
如果使用高版本的Jmeter版本,虽然不会报这个问题,但是性能指标却上不去,洒家也闹不明白。
直接上5.6与5.1的版本的压测对比数据
5.6
perfmon监测服务器资源:
5.1
这个时候,通过perfmon监控指标,cpu基本利用到顶了。
从上面的对比图可以看出,相同的脚本,不同版本下,TPS相差25左右,平均响应时间也有区别。
怀疑是引用了一个开源的工具包:hutool-all-5.8.20.jar
对比5.6和5.1的版本,发现jmeter.sh中JAVA9_OPTS有差异。
5.1的启动参数为:
JAVA9_OPTS="--add-opens java.desktop/sun.awt=ALL-UNNAMED --add-opens java.desktop/javax.swing.text.html=ALL-UNNAMED --add-opens java.desktop/sun.swing=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED"
5.6的启动参数为:
JAVA9_OPTS="--add-opens java.desktop/sun.awt=ALL-UNNAMED --add-opens java.desktop/sun.swing=ALL-UNNAMED --add-opens java.desktop/javax.swing.text.html=ALL-UNNAMED --add-opens java.desktop/java.awt=ALL-UNNAMED --add-opens java.desktop/java.awt.font=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.text=ALL-UNNAMED --add-opens=java.desktop/sun.awt.X11=ALL-UNNAMED --add-opens=java.desktop/sun.awt.shell=ALL-UNNAMED"
将5.1的参数替换为5.6的即可。