使用Jenkins和docker插件限制cpu的使用

时间:2019-10-01 22:50:57

标签: docker jenkins

我有一个使用Docker容器作为构建从属的Jenkins设置。

通过Docker插件将容器作为代理进行配置-而不是实例化容器的Jenkinsfiles。

机器是8线程i7,具有16GB内存和16GB交换文件。目前,我只运行一个容器。

如果容器中的构建使用所有8个线程,则似乎在构建时会导致OS OOM杀死某些GCC进程。生成任务混合在一起,有些可以显式控制make线程的数量,有些则可以查询系统的内核数量并扩展。当活动的线程数达到最大时,它似乎耗尽了RAM,而没有节流或停止工作-它似乎也没有充分利用交换。

我想限制允许Docker从属服务器使用的CPU内核数量,但是我找不到将--cpus = 2参数传递给Docker run命令的方法。份额参数似乎没有达到我想要的效果。

我很高兴从容器配置中明确分配资源,以使服务器更可靠,但我不希望它遇到硬限制并杀死OOM。

1 个答案:

答案 0 :(得分:0)

我不太确定如何启动Docker容器,但是如果您在插件的帮助下进行操作,我猜您是在Jenkinsfile中调用了myImage.inside(“ ...”)。在这种情况下,您应该能够在字符串参数中添加“ --cpus = 2”。这至少对我们有用。

但是,此解决方案的缺点是必须更新所有Jenkins作业,并且您无法确定所有Jenkins作业的创建者都记得这一点。因此,我们实施了其他解决方案,如果上述解决方案无效,则该解决方案将为您服务。基本上,我们创建了一个脚本来当有人叫docker时用作包装器。如果调用了“ docker run”,它将注入“ --cpus = 2”。否则,它会将呼叫转发给Docker。我们通过以下方式完成此任务:

  1. 将以下脚本放在/ home / jenkins / bin / docker中。 (“ 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
  1. 使其可执行
    chmod a+x /home/jenkins/bin/docker
  1. 通过更新〜/ .bashrc来修改路径。 (〜/ .bash_profile仅在您登录时生效,这意味着Jenkins不会选择它。)将“ / home / jenkins / bin”放在路径的首位,例如。 g。
    PATH=/home/jenkins/bin:$PATH