我有一个使用Docker容器作为构建从属的Jenkins设置。
通过Docker插件将容器作为代理进行配置-而不是实例化容器的Jenkinsfiles。
机器是8线程i7,具有16GB内存和16GB交换文件。目前,我只运行一个容器。
如果容器中的构建使用所有8个线程,则似乎在构建时会导致OS OOM杀死某些GCC进程。生成任务混合在一起,有些可以显式控制make线程的数量,有些则可以查询系统的内核数量并扩展。当活动的线程数达到最大时,它似乎耗尽了RAM,而没有节流或停止工作-它似乎也没有充分利用交换。
我想限制允许Docker从属服务器使用的CPU内核数量,但是我找不到将--cpus = 2参数传递给Docker run命令的方法。份额参数似乎没有达到我想要的效果。
我很高兴从容器配置中明确分配资源,以使服务器更可靠,但我不希望它遇到硬限制并杀死OOM。
答案 0 :(得分:0)
我不太确定如何启动Docker容器,但是如果您在插件的帮助下进行操作,我猜您是在Jenkinsfile中调用了myImage.inside(“ ...”)。在这种情况下,您应该能够在字符串参数中添加“ --cpus = 2”。这至少对我们有用。
但是,此解决方案的缺点是必须更新所有Jenkins作业,并且您无法确定所有Jenkins作业的创建者都记得这一点。因此,我们实施了其他解决方案,如果上述解决方案无效,则该解决方案将为您服务。基本上,我们创建了一个脚本来当有人叫docker时用作包装器。如果调用了“ docker run”,它将注入“ --cpus = 2”。否则,它会将呼叫转发给Docker。我们通过以下方式完成此任务:
#!/bin/bash
echo COMMAND: $0 with arguments: $@ >&2
if [ "$1" = 'run' ] ; then
echo 'INFO: I found a "run" command, limiting to 2 cpus' >&2
echo RUNNING: /usr/bin/docker "$1" --cpus=2 "${@:2}" >&2
/usr/bin/docker "$1" --cpus=2 "${@:2}"
else
echo RUNNING: /usr/bin/docker "$@" >&2
/usr/bin/docker "$@"
fi
chmod a+x /home/jenkins/bin/docker
PATH=/home/jenkins/bin:$PATH