容器中的 Jenkins 比服务器本身慢得多

Not*_*bby 6 jenkins docker

我们最近重做了詹金斯。我们决定在服务器上的 docker 容器上安装新版本。

在迁移时,我注意到詹金斯在容器中时比在服务器本身上运行时慢得多。

这是一个重大问题,可能会扰乱我们的迁移。

我尝试寻找为容器提供更多资源的方法,但没有太多帮助。

我怎样才能加快詹金斯容器的速度/为其提供服务器上所需的所有资源(该服务器仅专用于詹金斯)。

另外,当我也想启动从属容器时,如何分配这些资源?

Tho*_*eil 4

磁盘操作

Docker 可能会变慢的一件事是,当容器中运行的进程对容器文件系统进行大量 I/O 调用时。容器文件系统是联合文件系统,未针对速度进行优化。

这就是docker Volume有用的地方。除了在文件系统上提供一个在容器删除后仍然存在的位置之外,docker 卷上的磁盘性能也很好。

Jenkins Docker 镜像将该位置定义JENKINS_HOME为 Docker 卷,因此只要您的 Jenkins 作业在该位置进行磁盘操作就应该没问题。

如果您确定该卷上的磁盘访问仍然太慢,您可以在 Docker 主机上自定义该卷的安装位置,以便最终将其安装在快速驱动器(例如 SSD)上。

另一个技巧是使用tmpfs将 docker 卷安装到 RAM 。请注意,此类卷不提供持久性,并且当容器停止或删除时,该位置的数据将丢失。


JVM内存耗尽/垃圾收集器

由于 Jenkins 是一个 Java 应用程序,因此需要考虑另一个潜在问题:内存耗尽。如果 Jenkins 进程运行的 JVM 内存过于有限,Java 垃圾收集器将运行过于频繁。当您意识到 Java 应用程序使用了过多的 CPU(垃圾收集器使用 CPU)时,您可以见证这一点。如果是这种情况,请为 JVM 提供更多内存:

docker run-p 8080:8080 -p 50000:50000 --env JAVA_OPTS="-Xmx2048m -Djava.awt.headless=true" jenkins/jenkins:lts
Run Code Online (Sandbox Code Playgroud)

网络

Docker 容器具有虚拟网络堆栈和自定义网络设置。您还想确保所有与网络相关的操作都很快。

DNS 服务器可能有问题,请通过ping <some domain name>从 Jenkins 容器执行来检查。