如何使用预加载内存启动应用程序/容器的“n”个实例

Posted

技术标签:

【中文标题】如何使用预加载内存启动应用程序/容器的“n”个实例【英文标题】:How to spin up 'n' instances of an app / container with pre-loaded memory 【发布时间】:2019-02-27 15:36:02 【问题描述】:

背景: 我有一个语言处理 Java 应用程序,它需要大约 16MB 内存,并且在公开 Web 服务之前需要大约 40 秒将资源初始化到该内存中。我是容器和相关技术的新手,如果我的问题很明显,我深表歉意......

目标: 我想在预加载/预配置状态下按需提供数百个我的应用程序实例。 (例如,我可以调用 AWS 以建立我的应用程序的“n”个实例,它们将在

问题: 我期待我“可能”能够创建应用程序的 docker 映像,对其进行初始化并暂停,因此能够按需克隆并“取消暂停”?您能否告知我想要做的事情是否可行,如果可以,您将如何处理它。

AWS 是我选择的平台,因此任何 AWS 风格的细节都会非常有帮助。

【问题讨论】:

AWS 无法暂停实例并记住其状态。您必须将此功能添加到您的产品中。一旦您的产品能够快速加载,就有很多方法可以创建许多实例,这实际上取决于您的需求。 @kichik 的评论也适用于 Docker:Docker 映像只是一个文件系统映像,不包含任何正在运行的进程或内存状态。 感谢 kichik 和 david-maze,这些都是有用的说明! 【参考方案1】:

如果您不介意,我会将您的问题一分为二: 1. 启动 N 个容器(或者更有可能是按需扩展) 2. 预加载内存。

#1 是 Kubernetes 的生计,你可以在网上找到大量关于它的资源,所以请允许我专注于 #2。

真正的问题是您过于专注于可能的解决方案而无法看到全局: 您想“预加载内存”以加快启动时间(好吧,您认为 Java 在 40 年代做了哪些魔法内存预加载器不会做的事情?)。

另一种方法是启动容器,让 Java 在 40 秒内占用资源,但在此期间不让该容器可供全世界使用。 Kubernetes 提供了实现这一目标的工具,请参见此处:https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/

希望这会有所帮助!

【讨论】:

谢谢,关注 (2) 很有帮助。我预计在 40 年代,Java 忙于解包资源并在将一些数据结构存储在内存中之前对其进行处理,因此,我想知道是否有办法直接从缓存或磁盘加载填充的内存(有点像暂停VM)——取消暂停比从头开始重新启动操作系统并重新打开所有应用程序更快? 那个问题跟Kubernetes没有关系,那是关于Java对象(反)序列化的问题,恐怕帮不了你。我建议在谷歌上搜索“过早优化”一词。从 Kubernetes 的角度来看,有一个容器无法服务请求的时间范围,我在回答中解释了如何处理这个问题。你真的不应该关心它需要 40 秒还是 10 秒,我真的不明白这一点(它不会花费更多的云资源,它仍然足够快,可以自动扩展以满足实际需求,等等)。

以上是关于如何使用预加载内存启动应用程序/容器的“n”个实例的主要内容,如果未能解决你的问题,请参考以下文章

jvm容器的关系

基于spring的web项目启动时预加载数据到ServletContext

Spring Boot 启动预加载数据 CommandLineRunner

在 swift 3 中启动应用程序时,如何在另一个 ViewController 中预加载 UIWebView?

SpriteKit:播放前将声音文件预加载到内存中?

如何设置Docker容器中Java应用的内存限制