我们有一个最近移植到 docker 的 java 应用程序。此应用程序使用内存映射文件。在进行此更改时,我们观察到性能大幅下降,我们正在尝试准确诊断发生这种情况的原因。
我们之前的设置包括使用 CentOS 6.8、java 8 和存储在与应用程序运行相同的文件系统中的文件。我们的新设置包括 Docker 17.03、CentOS 7.4,openjdk:8u131-alpine
并将卷挂载到只读容器并保存用于内存映射文件的文件。
通过使用iostat
我们已经看到,tps
与非 docker 解决方案相比,在 docker 解决方案中是多次。我们不确定这是否是因为操作系统更频繁地将部分文件加载到内存中。使用我们可以理解 docker 解决方案中存在一些内存问题,一段时间后,应用程序内存不足Yourkit
。VisualVM
这可能是因为某些资源正在其他地方使用,并且应用程序无法正确处理所有传入负载。
此外,我们还想了解内存映射文件是使用容器内部还是容器外部的内存,因为我们将为容器本身保留更多或更少的内存。
此外,任何可以更好地了解此问题的根本原因的建议都将受到赞赏。