我在本地计算机上的 ubuntu 10.4(带有 vmware fusion)上成功测试了 jenkins-ci。现在我想在我位于 hosteurope 的虚拟服务器上安装和使用它。基本安装没问题,但现在我的构建项目有问题。
从存储库中提取 mercurial 更新后,ant 被调用并在我的构建项目中引发以下错误:
“构建文件:/var/lib/jenkins/workspace/concrete5-seed-clean/build.xml [property] java.io.IOException:无法运行程序“/usr/bin/env”:java.io.IOException:error= 12、无法分配内存”
hosteurope ( http://faq.hosteurope.de/index.php?cpid=13918 ) 的虚拟服务器上的堆大小存在一个已知问题,因此我尝试手动设置堆大小:
# for ant
export ANT_OPTS="-Xms512m -Xmx512m"
# jenkins
# edited /etc/default/jenkins, added line
JAVA_ARGS="-Xms512m -Xmx512m"
# restarted jenkins via /etc/init.d/jenkins restart
Run Code Online (Sandbox Code Playgroud)
为ant设置了这个之后,命令“ant -diagnostics”运行了,没有报错,但是我尝试构建项目的时候还是出现了这个错误。
服务器详细信息:- http://www.hosteurope.de/produkt/Virtual-Server-Linux-L
我的问题: - 1GB 足够 Jenkins 还是我必须升级服务器?- 这个错误是由 ant 还是 jenkins 引起的?
更新:我使用 ant 选项 -Xmx128m -Xms128m 运行它,但有时错误再次发生。(这让我很害怕,因为我现在无法重现它:/)
非常感谢帮助!
干杯,马蒂亚斯
Pat*_*ick 10
Orien 是正确的,它是由 ProcessBuilder 或 Runtime.exec 或 JVM 执行外部进程的其他方式(例如另一个 JVM 运行 ant、git 命令等)触发的 fork() 系统调用。
Jenkins 邮件列表上有一些关于此的帖子:无法运行程序“git”...错误=12,无法分配内存
SCons 开发人员列表上对该问题有一个很好的描述:fork()+exec() vs posix_spawn()
有一个长期存在的 JVM 错误报告和解决方案:在 S10 上使用 posix_spawn 而不是 fork 以避免交换耗尽。但我不确定这是否真的像评论所暗示的那样进入了 JDK7。
总之,在类 Unix 系统上,当一个进程(例如 JVM)需要启动另一个进程(例如 git)时,系统调用会fork()
有效地复制当前进程及其所有内存(Linux 和其他系统使用 copy -on-write 以便在孩子尝试写入之前不会实际复制内存)。然后复制的进程进行另一个系统调用,exec()
以启动另一个进程(例如 git),此时操作系统可能会丢弃从父进程复制的所有内存。如果父进程使用大量内存(如 JVM 进程往往会这样做),fork()
如果操作系统确定它没有足够的内存+交换来保存两个副本,则调用可能会失败,即使子进程实际上永远不会使用复制的内存。
有几种解决方案:
向机器添加更多物理内存/RAM。
添加更多的交换空间来诱使它fork()
工作,即使交换空间并不是任何东西都严格需要的。这是我选择的解决方案,因为添加交换文件相当容易,而且我不想忍受由于过度使用而导致进程被杀死的可能性。
在 Linux 上,启用overcommit_memory
vm 系统的选项 ( /proc/sys/vm/overcommit_memory )。使用过量使用,调用fork()
总是会成功,并且由于子进程实际上不会使用该内存副本,所以一切都很好。当然,有可能由于过度使用,您的进程实际上会尝试使用比可用内存更多的内存,并会被内核杀死。这是否合适取决于机器的其他用途。关键任务机器可能不应该冒内存不足的杀手横行的风险。但是可以承受一些停机时间的内部开发服务器将是启用过度使用的好地方。
将 JVM 更改为不使用fork()
+exec()
而是posix_spawn()
在可用时使用。这是上面 JVM 错误报告中请求并在 SCons 邮件列表中提到的解决方案。它也在java_posix_spawn 中实现。
我试图找出该修复程序是否已进入 JDK7。如果没有,我想知道 Jenkins 的人是否会对诸如 java_posix_spawn 之类的工作感兴趣。似乎已经尝试将其集成到Apache commons-exec 中。
Programmieraffe,我不是 100% 确定,但您的链接确实表明该修复程序在 JDK7 和 JDK6 1.6.0_23 及更高版本中。作为记录,我运行的是 OpenJDK 1.6.0_18。
ANT_OPTS 很可能被 Jenkins 覆盖。您还可以直接在构建文件中设置选项,以便可以独立于环境(shell、Jenkins 等)控制内存分配。在您的构建文件中(例如:
<java fork="true" classname="..." >
<jvmarg line="-Xms512M -Xmx512M" />
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
17752 次 |
最近记录: |