多 WAR tomcat 与 Docker 容器

cod*_*ith 7 java performance spring tomcat docker

我想知道 Docker 解决方案是否比我当前的 Tomcat 部署更快、内存效率更高。我将解释这两种解决方案。

当前:我有一个部署了大约 20 个 WAR 的 Tomcat 服务器。WAR 是 Spring Boot 应用程序。它也占用大量内存、启动时间和金钱。

docker 替代方案:我正在考虑的替代方案是带有 20 个 docker 容器的 docker 主机,每个应用程序一个。Spring 似乎建议在 JDK 映像上使用 JAR。

现在,Docker 或一般的容器化是否可以提高内存和速度?

我期待的一项改进是应用程序可以并行启动。这有望加快启动时间(假设是多核硬件)。我就在这里吗?

其次,我想知道哪种方法可以最有效地处理内存。当我有多个 WAR 共享完全相同的依赖项时会发生什么?Tomcat 会为此重用依赖内存吗?Docker 会吗?

Hir*_*uri 2

内存(以及可能的 CPU)效率是有争议的,并且可能需要测量。让我提供一些见解。

假设您创建了 20 个容器,每个容器对应您想要运行的一场战争。那时内存中有 20 个不同的 JVM。根据它们是否来自相同的容器映像或不同的容器映像,操作系统会识别它们是相同的,并且可以共享代码库。因此,这取决于您是否将战争烘焙到容器镜像中,或者只有一个镜像并在运行时挂载战争。

永久代空间、堆或其他内存区域怎么样?我怀疑操作系统是否可以在此处的进程之间共享很多内容。而且 JVM 无法在其级别上共享,因为 docker 容器隔离不允许它们相互通信。因此 JVM 级别的共享内存丢失了。

这样,每个 JVM 都会启动并运行热点代码位置的 JIT,并且应用程序之间无法使用协同作用。如果内存中的代码库更大,CPU 也必须在进程之间跳转更多,从而更频繁地使缓存失效。

总而言之,我相信对您的设置进行 Docker 化是对应用程序隔离的改进。您可以更轻松地安装/卸载您的东西,并且一个运行严重破坏的应用程序不会影响其他应用程序。但就性能而言,您应该注意到执行时间较短和内存使用量较高。到什么程度可能只能进行基准测试。