【问题标题】:Limit cpu's with Jenkins and docker plugin使用 Jenkins 和 docker 插件限制 cpu
【发布时间】:2019-10-01 22:50:57
【问题描述】:

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

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

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

如果容器中的构建使用全部 8 个线程,它似乎会在构建时导致 OS OOM 杀死一些 GCC 进程。构建任务混合在一起,有些我可以显式控制 make 线程的数量,其他的它将查询系统的核心数量并扩大范围。当有最大数量的活动线程时,它似乎会耗尽 RAM 而不会限制或停止工作 - 它似乎也没有充分利用交换。

我想限制 Docker 从站允许使用的 CPU 内核数量,但我找不到将 --cpus=2 参数传递给 Docker 运行命令的方法。 share 参数似乎没有我想要的效果。

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

【问题讨论】:

    标签: docker jenkins


    【解决方案1】:

    我不太确定你是如何启动 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" FIRST 放在路径中,e. g.
        PATH=/home/jenkins/bin:$PATH
    

    【讨论】:

      猜你喜欢
      • 2016-06-25
      • 2015-07-14
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 2019-10-20
      相关资源
      最近更新 更多