I / O密集型Java应用程序在有限的资源上加速了Docker

我有一个I / O密集型的Java Tomcat应用程序,我想在更现代的集群环境中执行htmlunittesting。 因此,我也考虑了docker,可以通过应用swarm等提供很酷的function。

testing针对oracle数据库运行,并在本地I / O上创buildstream量。 我只是好奇一个问题:

当我使用有限资源(负载15因子在1 CPU系统上高于2)的普通安装来运行testing时,testing执行时间比使用docker化方法的相同环境(有限资源)慢35%左右testing执行。 如果有足够的资源保持负载因子低于1(在1 CPU系统上),则普通安装和dockerized安装之间的运行时间几乎相同。

我正在寻找解释这个的方法。 是关于一些覆盖文件系统caching机制? 在调查这个地方的时候要看哪里?

该答案对于您的应用程序非常具体,因此您只需testing各种docker存储设置即可。

首先,用本地数据卷testing应用程序。 本地卷或将本地目录挂载为卷 。 这个删除的大部分开销,应该是接近主机IO速度,你会得到。

如果您的应用程序全速运行,那么Docker存储驱动程序可能是罪魁祸首,因此您可以尝试docker守护程序的其他选项,以查看哪个最好。

  • 不要在循环模式下使用devicemapper! --storage-driver==devicemapper \ --storage-opt dm.loop*
  • AUFS --storage-driver==aufs
  • OverlayFS --storage-driver==overlay2或在4.x之前的内核上overlay
  • Direct LVM – --storage-driver==devicemapper \ --storage-opt dm.datadev=/dev/dockervg/datalv \ --storage-opt dm.metadatadev=/dev/dockervg/metadatalv
    这也需要一些lvm设置。

testing每个驱动程序。
每次交换时,您的容器数据都将被销毁。
然后使用最好的驱动程序。

安装本地卷可能是最快的,如果你select,那么你处理的数据被存储在容器外。