我正在尝试为应用程序运行负载测试。为此,我在Ubuntu Vm上使用JMeter(v.2.13),具有60GB Ram和足够的CPU功率。目标是通过WebSocket连接10k用户。
然而,在测试运行期间,我在ssh-console上遇到以下错误(大约1.5k到2.5k模拟用户)
OpenJDK 64-Bit Server VM warning: Attempt to protect stack guard pages failed.
OpenJDK 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed.
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f20ee653000, 12288, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 12288 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /jmetertests/jm/bin/hs_err_pid1833.log
OpenJDK 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed.
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f2218de8000, 12288, 0) failed; error='Cannot allocate memory' (errno=12)
上述错误报告文件如下所示
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 12288 bytes for committing reserved memory.
# 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 (os_linux.cpp:2798), pid=1833, tid=140472285792000
#
# JRE version: OpenJDK Runtime Environment (7.0_75-b13) (build 1.7.0_75-b13)
# Java VM: OpenJDK 64-Bit Server VM (24.75-b04 mixed mode linux-amd64 )
# Derivative: IcedTea 2.5.4
# Distribution: Ubuntu 14.04 LTS, package 7u75-2.5.4-1~trusty1
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
我尝试通过在.sh文件中发出java命令之前添加以下行来修改jmeter.sh来分配更多内存:
JVM_ARGS="-Xms5g -Xmx20g -Xss300k"
我还尝试使用以下命令设置_JAVA_OPTIONS
环境变量
export _JAVA_OPTIONS="-Xms5g -Xmx20g"
最后我发现这个命令是一些SO线程
sysctl -w vm.max_map_count=500000
top
- 命令为我提供了有关内存的以下信息
KiB Mem: 61836576 total, 15163400 used, 46673176 free, 10636 buffers
KiB Swap: 0 total, 0 used, 0 free. 94492 cached Mem
仅供参考:除了简单的数据编写器之外,我在JMeter中不使用任何监听器。但是,即使我禁用了最后一个侦听器,也会抛出错误。
java -Xms40g -version
是成功的 - 所以我真的可以分配这么多的内存
我使用
缩小了堆栈大小-Xss300k
这帮助至少改变了一些东西,因为我现在得到了一个
Uncaught Exception java.lang.OutOfMemoryError:
unable to create new native thread. See log file for details.
错误。似乎系统上的线程数用尽了?
根据某些用户的要求,结果为ulimit -a
core file size (blocks, -c) 0
scheduling priority (-e) 0
pending signals (-i) 491456
max locked memory (kbytes, -l) 64
open files (-n) 500000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
max user processes (-u) 491456
... all other entries are set to 'unlimited'
和limits.conf包含以下条目
* hard nofile 900000
* soft nofile 900000
root hard nofile 900000
root soft nofile 900000
另外,我已将threads-max
设置为proc/sys/kernel
以下的高度值,并且还增加了proc/sys/vm/max_map_count
我错过了什么或者我做错了什么吗? 谢谢你的帮助。
答案 0 :(得分:4)
首先检查是否可以通过以下命令分配多达50G的堆:
java -Xms50G -version
如果它没有成功 - 尝试减少最小堆大小,除非您看到Java版本信息没有错误。
只要您不出现java.lang.OutOfMemoryError: Java heap space
错误,我相信您的堆大小调整已成功应用。
也许您启用了内存密集型侦听器,例如View Results Tree或View Results in Table?如果是这样 - 禁用它们(以及任何其他侦听器)
如果可能的话,尝试切换到Oracle JDK,至少对于Java 6来说,存在巨大的性能差异。
另请确保您遵循JMeter Performance and Tuning Tips指南中的建议。
答案 1 :(得分:3)
好的同时我想出来了:
limits.conf
(见下文)/etc/security/limits.conf文件
* hard nofile 900000
* soft nofile 900000
root hard nofile 900000
root soft nofile 900000
/etc/sysctl.conf中
kernel.pid_max=999999
kernel.thread-max=999999
vm.max_map_count=999999
fs.file-max=999999
注意:是pid _ max和thread-max
您将在jmeter安装的/bin/
文件夹中找到它们。
在linux下添加行
JVM_ARGS="-Xmx15g -Xss250k"
在最后一行实际java调用之前的某个地方。这将减少为每个线程分配的堆栈大小。
在windows下你需要编辑jmeter.bat。 我没有在Windows下配置它,但至少在堆上应该有一行以set HEAP
开头。我不知道将-Xss
参数放在windows下的位置。