运行大量线程时JMeter会出现问题

时间:2013-01-30 18:09:26

标签: jmeter

我正在使用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中更改堆大小,但这似乎没有任何帮助。

6 个答案:

答案 0 :(得分:14)

JVM根本无法running so many threads。即使是这样,JMeter也会消耗大量的CPU资源来纯粹切换上下文。换句话说,在某些方面,您不是对Web应用程序进行基准测试,而是对托管JMeter的客户端计算机进行基准测试。

你几乎没有选择:

  • 使用JVM选项进行实验,例如: 默认-Xss512K减少到更小的

  • 运行JMeter in a cluster

  • 使用工具采用截然不同的方法,例如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