11

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

4

6 回答 6

13

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

你有几个选择:

  • 尝试 JVM 选项,例如将默认值减小-Xss512K到更小的值

  • 在集群中运行JMeter

  • 使用采取完全不同方法的工具,例如加特林

于 2013-01-30T18:21:46.507 回答
5

我遇到了类似的问题,并将 jmeter.bat 中的堆大小增加到 1024M,从而解决了这个问题。

set HEAP=-Xms1024m -Xmx1024m
于 2013-04-24T08:20:19.607 回答
3

对于 JVM,如果您阅读 hprof,它会为您提供一些解决方案,其中包括:

  • 切换到 64 位 jvm ( > 6_u25)

  • 有了这个,你将能够分配更多的堆 (-Xmx) ,确保你有这个 RAM

  • 减少 Xss:

-Xss256k

然后对于 JMeter,遵循最佳实践:

最后确保您使用最新的 JMeter 版本。

  • 最好使用linux操作系统

  • 调整 TCP 堆栈,限制

成功将取决于您的机器功率(CPU 和内存)和您的测试计划。

如果这还不够(对于 3000 个线程应该没问题),您可能需要使用分布式测试

于 2013-01-30T23:08:44.607 回答
2

在 jmeter.bat 中增加堆大小可以正常工作 set HEAP=-Xms1024m -Xmx1024m

或者,如果您使用 jmeter.sh,您可以执行以下操作:JVM_ARGS="-Xms512m -Xmx1024m" jmeter.sh 等。

于 2014-09-17T13:48:31.570 回答
2

我遇到了同样的问题,唯一对我有帮助的解决方案是: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
于 2016-04-26T22:03:33.040 回答
-1

增加XmsetXmx堆大小后,我不得不让我的 Java 在 64 位模式下运行。在jmeter.bat

set JM_LAUNCH=java.exe -d64

显然,您需要运行 64 位操作系统并已安装 Java 64 位(请参阅https://www.java.com/en/download/manual.jsp

于 2017-08-24T13:18:47.827 回答