gpt4 book ai didi

java - Jenkins服务器启动时“内存不足”

转载 作者:行者123 更新时间:2023-11-30 10:56:23 26 4
gpt4 key购买 nike

Jenkins的首次用户在这里,开始使用时遇到了一些麻烦。在Linux Shell中,我运行以下命令:

java -Xms512m -Xmx512m -jar jenkins.war


并持续出现如下错误:

# There is insufficient memory for the Java Runtime Environment to continue.
# pthread_getattr_np
# An error report file with more information is saved as:
# /home/twilliams/.jenkins/hs_err_pid36290.log


首先,基础知识:


詹金斯1.631
通过战争文件中嵌入的码头运行
OpenJDK 1.7.0_51
Oracle Linux(3.8.13-55.1.5.el6uek.x86_64)
386 GB内存
40核


我在其他许多配置上也遇到相同的问题:使用Java Hotspot 1.8.0_60,通过Apache Tomcat运行,并对 -Xms/-Xmx/-Xss和类似选项使用各种不同的值。

我已经做了大量研究,认为我知道问题出在哪里,但是如何解决却无所适从。我怀疑我遇到了 here提到的虚拟内存过量使用问题; ulimit中的相关位:

--($:)-- ulimit -a
...
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) 8388608
stack size (kbytes, -s) 8192
virtual memory (kbytes, -v) 8388608
...


如果我将虚拟内存限制以root的身份加倍,则可以启动Jenkins,但我不希望以root用户身份运行Jenkins。

另一个解决方法:即将淘汰的具有48 GB内存和24个内核的计算机可以毫无问题地启动Jenkins,尽管(我怀疑):根据htop的说法,它的虚拟内存占用量刚刚超过8 GB。因此,我怀疑内存过量使用问题会随着计算机上处​​理器数量的增加而扩展,这大概是詹金斯启动与主机上存在的处理器数量成比例的线程数量的结果。我通过 ps -eLf | grep jenkins | wc -l粗略地捕获了线程数,发现40核计算机上的线程数峰值在114左右,而24核计算机上的线程数峰值在84左右。

这种解释听起来合理吗?只要能做到...


有什么方法可以配置Jenkins来减少启动时产生的线程数?我尝试了讨论 here的论点,但正如所宣传的那样,它们似乎没有任何作用。
是否有可用的VM不会受到过量使用问题的困扰,或者是否有其他配置选项可以解决该问题?


这时最明智的选择可能是只在虚拟化环境中运行Jenkins,以将其可使用的资源限制在合理的范围内,但是在这一点上,我对知识上的这个问题很感兴趣,并且想知道如何获得该资源。顽强的配置行为。

编辑

这是hs_error.log文件的摘录,它指导了我的初步调查:

# There is insufficient memory for the Java Runtime Environment to continue.
# pthread_getattr_np
# 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.


这是我尝试过的几个命令行,所有命令行都具有相同的结果。


从少量的堆空间开始:


java -Xms2m -Xmx2m -Xss228k -jar jenkins.war

从明显更多的堆空间开始:


java -Xms2048m -Xmx2048m -Xss1m -XX:ReservedCodeCacheSize=512m -jar jenkins.war

增长空间:


java -Xms2m -Xmx1024m -Xss228k -jar jenkins.war



还尝试了许多其他配置。最终,我认为问题不在于这里的堆耗尽-而是JVM试图为其自身保留过多的虚拟内存(用于存储堆,线程堆栈等),而不是ulimit设置所允许的。大概这是先前链接的过量使用问题的结果,因此,如果Jenkins产生了120个线程,则错误地试图保留120倍于最初占用的主进程的VM空间。

在使用该日志中建议的其他选项完成了我所能做的一切之后,我试图找出如何减少Jenkins中的线程数以测试线程VM过量使用的理论。

编辑#2

根据MichałGrzejszczak的说法,这是与Red Hat Enterprise Linux 6一起分发的glibc的问题,如 here所述。可以通过显式设置环境变量 MALLOC_ARENA_MAX(在我的情况下为 export MALLOC_ARENA_MAX=2)来解决此问题。如果没有显式设置此变量,JVM显然将尝试生成(8 x cpu核心数)线程,每个线程消耗64M。我的40核心机箱将需要向北10个虚拟内存,超过(单独)我的8个虚拟机的限制。将此设置为2可将VM消耗减少到约128兆。

最佳答案

Jenkins的内存占用量与其管理的项目数量和大小有关,而不是与CPU或可用内存的数量有关。除非您有巨大的项目,否则Jenkins应该在1GB的堆内存上运行良好。

不过,您可能配置了JVM。 -Xmx和-Xms参数控制JVM可以使用的堆空间。 -Xmx是堆内存的限制,-Xms是堆内存的起始值。堆是整个JVM的单个内存区域。您可以通过JConsole或VisualVM等各种工具轻松监视它。

另一方面,-Xss与堆无关。它是此JVM进程中所有线程的线程堆栈大小。由于Java程序倾向于创建大量线程,因此将该参数设置得太大可能会阻止程序启动。通常,此值在512kb范围内。在此处输入512m会使JVM无法启动。确保您的设置不包含任何此类错误(并发布您的内存配置)。

关于java - Jenkins服务器启动时“内存不足”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33027437/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com