我有一个使用 Docker 容器作为构建从站的 Jenkins 设置。
容器通过 Docker 插件配置为代理 - 而不是实例化容器的 Jenkinsfiles。
机器是 8 线程 i7,16GB 内存和 16GB 交换文件。目前我只运行一个容器。
如果容器中的构建使用所有 8 个线程,则似乎会导致在构建时操作系统 OOM 杀死一些 GCC 进程。构建任务混合在一起,有些我可以明确控制生成线程的数量,其他的它会查询系统的核心数量并扩大范围。当有最大数量的线程处于事件状态时,它似乎会用完 RAM 而不会限制或停止工作 - 它似乎也没有充分利用交换空间。
我想限制 Docker slave 允许使用的 CPU 内核数量,但我找不到将 --cpus=2 参数传递给 Docker run 命令的方法。 shares 参数似乎没有达到我想要的效果。
我很乐意从容器配置中显式分配资源,以使服务器更可靠,但我不希望它遇到硬限制并导致 OOM 终止。
最佳答案
我不太确定您是如何启动 Docker 容器的,但如果您借助插件来启动,我猜您会在 Jenkins 文件中进行调用,例如 myImage.inside("...")。在这种情况下,您应该能够添加“--cpus=2”作为字符串参数的一部分。这至少对我们有用。
然而,此解决方案的缺点是所有 Jenkins 作业都必须更新,您永远无法确定 Jenkins 作业的所有创建者都记得这一点。因此,我们实现了一个不同的解决方案,如果上述解决方案不起作用,它应该适合您。当任何人调用 docker 时,我们基本上创建了一个脚本作为包装器。如果调用“docker run”,它会注入(inject)“--cpus=2”。否则它只是将调用转发给 Docker。我们通过以下方式实现了这一目标:
- 将以下脚本放入/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
- 让它可执行
chmod a+x /home/jenkins/bin/docker
- 通过更新 ~/.bashrc 修改路径。 (~/.bash_profile 仅在您登录时生效,这意味着 Jenkins 不会接收它。)将“/home/jenkins/bin”放在路径的第一位,例如。 g.
PATH=/home/jenkins/bin:$PATH
关于docker - 使用 Jenkins 和 docker 插件限制 cpu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58193256/