JMeter-Linux上的内存不足 [英] JMeter - out of memory on linux

查看:378
本文介绍了JMeter-Linux上的内存不足的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试为应用程序运行负载测试.为此,我在具有60GB Ram和超过足够CPU能力的Ubuntu Vm上使用JMeter(v.2.13).目标是达到通过WebSocket连接的1万名用户.

I am trying to run a load test for a application. For this i am using JMeter (v.2.13) on an Ubuntu Vm with 60GB Ram and more than enough CPU power. Goal is to reach 10k Users connected via WebSocket.

但是在测试运行期间,我在ssh-console上遇到以下错误(模拟用户大约为1.5k至2.5k)

However during the test runs i get the following errors on the ssh-console (at approx. 1.5k to 2.5k simulated users)

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)

提到的错误报告文件看起来像这样

The mentioned error report file looks like this

# 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来分配更多的内存:

I tried to allocate more memory by modifying the jmeter.sh through adding the following line right before the java-command is issued in the .sh-file:

JVM_ARGS="-Xms5g -Xmx20g -Xss300k"

我还尝试使用以下命令设置_JAVA_OPTIONS环境变量

I also tried setting the _JAVA_OPTIONS environment variable with the following command

export _JAVA_OPTIONS="-Xms5g -Xmx20g"

最后我发现此命令在某些SO线程中

And finally I found this command im some SO-thread

sysctl -w vm.max_map_count=500000

top-命令为我提供了以下有关内存的信息

The top-Command gives me the following information on memory

KiB Mem:  61836576 total, 15163400 used, 46673176 free,    10636 buffers
KiB Swap:        0 total,        0 used,        0 free.    94492 cached Mem

更新

仅供参考:除简单的数据编写器外,我在JMeter中不使用任何侦听器.但是,即使我禁用了最后一个侦听器,也会引发错误.

UPDATE

FYI: I do not use any listeners in JMeter except the simple data writer. However errors are thrown even if I disable that last listener.

java -Xms40g -version

是成功的-所以我真的可以分配这么多的内存

is succesful - so i can really allocate so much memory

我通过使用减小了堆栈大小

I reduced the stack size by using

-Xss300k

这至少在我得到

Uncaught Exception java.lang.OutOfMemoryError:
unable to create new native thread. See log file for details.

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

error. It seems that the number of threads on the system are exhausted?

根据某些用户的要求,结果uf ulimit -a

as requested by some user the results 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包含以下条目

and the limits.conf contains the following entries

*         hard    nofile      900000
*         soft    nofile      900000
root      hard    nofile      900000
root      soft    nofile      900000

另外,我已经将proc/sys/kernel下的threads-max设置为高得离谱,并且还增加了proc/sys/vm/max_map_count的值

Additonally i have set the threads-max under proc/sys/kernel to something ridiculous high and also increased the value of proc/sys/vm/max_map_count

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

Did I miss something or did i do something wrong? Thank you for your help.

推荐答案

好的,与此同时,我知道了:

Okay meanwhile i figured it out:

  1. 确保阅读Dmriti T的帖子
  2. 将Java的stacksize设置为较小的值-通常最小的值就足够了.就我而言,为200k(另请参阅第4点).
  3. 增加sysctl.conf中打开文件的最大数量 (请参见第4点)
  4. 增加堆大小-但由于jmeter将创建很多线程,也为线程在OS级别上需要的内存留出了足够的空间(因此,新线程在OS和Java堆上需要内存-因此也为os留有足够的内存)(请参见下文)
  5. 更新limits.conf(请参见下文)
  6. 更新sysctl.conf文件(见下文)
  1. make sure to read Dmriti T's post
  2. set the java's stacksize to something small - usually the smallest value will be enough. In my case 200k (see also point 4.)
  3. increase the maximum number of open files in the sysctl.conf (see point 4)
  4. increase heap size - but as jmeter will create a lot of threads also leave enough space for the memory the threads will need on OS level (so a new thread needs memory on OS and java heap - therefore leave the os enough memory too) (see below)
  5. update the limits.conf (see below)
  6. update the sysctl.conf-file (see below)

limits.conf

/etc/security/limits.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

sysctl.conf

/etc/sysctl.conf

kernel.pid_max=999999
kernel.thread-max=999999
vm.max_map_count=999999
fs.file-max=999999

注意:最大pid _ 和最大线程

attention: is pid_max and thread-max

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

you will find those in the /bin/ folder of your jmeter installation.

在Linux下添加该行

under linux add the line

JVM_ARGS="-Xmx15g -Xss250k"

在最后一行中实际java调用之前的某个位置.这样会减少分配给每个线程的堆栈大小.

somewhere before the actual java call on the last line. This will decrease the stacksize allocated for each thread.

在Windows下,您必须编辑jmeter.bat. 我没有在Windows下配置它,但至少关于堆,应该有一个以set HEAP开头的行.我不知道将-Xss参数放在Windows下的位置.

under windows you have to edit the jmeter.bat. I have no configured it under windows but at least regarding the heap there should be a line starting with set HEAP. I dont know where to put the -Xss parameter under windows.

这篇关于JMeter-Linux上的内存不足的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆