我有一个使用Docker容器作为构建奴隶的Jenkins设置。
容器是通过Docker插件提供的代理,而不是实例化容器的Jenkinsfile。
机器是一个具有16 i7内存和16 i7交换文件的8线程i7。目前我只运行一个容器。
如果容器中的构建使用所有8个线程,则在构建过程中似乎会导致OS OOM杀死某些GCC进程。有一个混合的构建任务,有些我可以显式地控制线程的数量,另一些则会查询系统的内核数量和宽度。当最大数量的线程处于活动状态时,它似乎耗尽了RAM而没有节流或延迟工作--它似乎也没有充分利用交换空间。
我想限制Docker从服务器允许使用的CPU内核的数量,但是我无法找到将--CPU=2参数传递给Docker run命令的方法。股票论似乎没有我想要的效果。
我很高兴从容器配置中显式地分配资源,以使服务器更加可靠,但我不希望它陷入硬限制,并使OOM失效。
发布于 2019-12-06 15:30:22
我不太清楚您是如何启动Docker容器的,但是如果您在插件的帮助下启动这个容器,我猜您在Jenkinsfile中打了一个电话,比如myImage.inside(“.”)。在这种情况下,您应该能够添加"--cpus=2“作为字符串参数的一部分。至少对我们来说是这样。
然而,该解决方案的缺点是,所有Jenkins作业都必须更新,而且您永远无法确保Jenkins作业的所有创建者都记住这一点。因此,我们实现了一个不同的解决方案,如果上面的解决方案不适用的话,这个解决方案应该适用于您。我们基本上创建了一个脚本,当任何人调用docker时,脚本作为包装器工作。如果调用"docker run“,它会注入”--cpu=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:$PATHhttps://stackoverflow.com/questions/58193256
复制相似问题