JMeter-Linux内存不足

我正在尝试为应用程序运行负载测试。为此,我在具有60GB Ram和超过足够CPU能力的Ubuntu

Vm上使用JMeter(v.2.13)。目标是达到通过WebSocket连接的1万名用户。

但是,在测试运行期间,我在ssh控制台上收到以下错误(大约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-Command使我对内存的下列信息

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.

错误。看来系统上的线程数已用完?

更新2

根据某些用户的要求,结果uf 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-maxunder

设置为proc/sys/kernel高得离谱,并且还增加了proc/sys/vm/max_map_count

我错过了什么还是做错了什么?谢谢您的帮助。

回答:

好的,与此同时,我弄清楚了:

  1. 确保阅读Dmriti T的帖子
  2. 将Java的stacksize设置为较小的值-通常最小的值就足够了。就我而言,为200k(另请参阅第4点)。
  3. 增加sysctl.conf 中打开文件 的最大 数量 (请参见第4点)
  4. 增加堆大小-但由于jmeter将创建很多线程,也为线程在OS级别上需要的内存留出了足够的空间(因此,新线程在OS和Java堆上需要内存-因此也为os留有足够的内存)(请参阅下面)
  5. 更新limits.conf(请参见下文)
  6. 更新sysctl.conf文件(如下所示)

limits.conf

/etc/security/limits.conf

*         hard    nofile      900000

* soft nofile 900000

root hard nofile 900000

root soft nofile 900000

sysctl.conf

/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.sh / jmeter.bat

您将在/bin/jmeter安装文件夹中找到这些文件。

在Linux下添加行

JVM_ARGS="-Xmx15g -Xss250k"

最后一行中实际Java调用之前的某处。这将减少分配给每个线程的堆栈大小。

在Windows下,您必须编辑jmeter.bat。我没有在Windows下配置它,但至少关于堆应该以开头set

HEAP。我不知道-Xss在Windows下将参数放在哪里。

以上是 JMeter-Linux内存不足 的全部内容, 来源链接: utcz.com/qa/433013.html

回到顶部