我正在使用Apache的Jmeter进行测试,我只是访问我公司网站的一个页面并调高用户数量直到达到阈值,问题是当我到达大约3000个线程时JMeter没有运行所有这些。查看聚合图 它们只运行大约2,536(这个数字不一样,但总是在这里)。
部分运行在日志中出现以下异常:
01:16 ERROR - jmeter.JMeter: Uncaught exception:
java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Unknown Source)
at org.apache.jmeter.threads.ThreadGroup.start(ThreadGroup.java:293)
at org.apache.jmeter.engine.StandardJMeterEngine.startThreadGroup(StandardJMeterEngine.java:476)
at org.apache.jmeter.engine.StandardJMeterEngine.run(StandardJMeterEngine.java:395)
at java.lang.Thread.run(Unknown Source)
此行为是一致的。此外,有一次JMeter在中间坠毁,输出一个文件说:
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 32756 bytes for ChunkPool::allocate
# Possible reasons:
# The system is out of physical RAM or swap space
# In 32 bit mode, the process size limit was hit
# Possible solutions:
# Reduce memory load on the system
# Increase physical memory or swap space
# Check if swap backing store is full
# Use 64 bit Java on a 64 bit OS
# Decrease Java heap size (-Xmx/-Xms)
# Decrease number of Java threads
# Decrease Java thread stack sizes (-Xss)
# Set larger code cache with -XX:ReservedCodeCacheSize=
# This output file may be truncated or incomplete.
#
# Out of Memory Error (allocation.cpp:211), pid=10748, tid=11652
#
# JRE version: 6.0_31-b05
# Java VM: Java HotSpot(TM) Client VM (20.6-b01 mixed mode, sharing windows-x86 )
任何想法?
我尝试在jmeter.bat中更改堆大小,但这似乎没有任何帮助。
答案 0 :(得分:14)
JVM根本无法running so many threads。即使是这样,JMeter也会消耗大量的CPU资源来纯粹切换上下文。换句话说,在某些方面,您不是对Web应用程序进行基准测试,而是对托管JMeter的客户端计算机进行基准测试。
你几乎没有选择:
使用JVM选项进行实验,例如: 将默认-Xss512K
减少到更小的
使用工具采用截然不同的方法,例如Gatling
答案 1 :(得分:4)
我遇到了类似的问题,并将jmeter.bat中的堆大小增加到1024M,这解决了这个问题。
set HEAP=-Xms1024m -Xmx1024m
答案 2 :(得分:3)
对于JVM,如果您阅读hprof,它会为您提供一些解决方案:
切换到64位jvm(> 6_u25)
这样你就可以分配更多堆(-Xmx),确保你有这个RAM
通过以下方式减少Xss:
-Xss256k
然后,对于JMeter,请遵循最佳实践:
最后确保使用上一个JMeter版本。
最好使用linux OS
调整TCP堆栈,限制
成功取决于您的机器功率(CPU和内存)以及您的测试计划。
如果这还不够(对于3000个线程应该没问题),您可能需要使用分布式测试
答案 3 :(得分:2)
在jmeter.bat中增加堆大小可以正常工作 设置HEAP = -Xms1024m -Xmx1024m
OR 如果你使用jmeter.sh,你可以做类似下面的事情: JVM_ARGS =" -Xms512m -Xmx1024m" jmeter.sh等。
答案 4 :(得分:1)
我遇到了同样的问题,帮助我的唯一解决方案是:https://stackoverflow.com/a/26190804/5796780
linux上正确的100k线程:
ulimit -s 256
ulimit -i 120000
echo 120000 > /proc/sys/kernel/threads-max
echo 600000 > /proc/sys/vm/max_map_count
echo 200000 > /proc/sys/kernel/pid_max
如果您没有root权限:
echo 200000 | sudo dd of=/proc/sys/kernel/pid_max
答案 5 :(得分:-1)
增加Xms
et Xmx
堆大小后,我不得不让我的Java以64位模式运行。在jmeter.bat
:
set JM_LAUNCH=java.exe -d64
显然,您需要运行64位操作系统并安装了Java 64位(参见https://www.java.com/en/download/manual.jsp)