一旦我的 docker 达到其最大内存限制,AWS EB 应该创建新实例

Posted

技术标签:

【中文标题】一旦我的 docker 达到其最大内存限制,AWS EB 应该创建新实例【英文标题】:AWS EB should create new instance once my docker reached its maximum memory limit 【发布时间】:2017-10-06 19:23:13 【问题描述】:

我已经使用 Elastic Beanstalk 在 AWS 服务器中部署了我的 dockerized 微服务,该服务是使用 Akka-HTTP(https://github.com/theiterators/akka-http-microservice) 和 Scala 编写的。

我为每个 docker 和性能问题分配了 512mb 内存大小。我注意到当服务器收到更多请求(如 20%、23%、45%...)时 CPU 使用率会增加并且取决于负载,然后它会自动降到正常状态(0.88%)。但是每次请求的内存使用量都在不断增加,即使在 CPU 使用率达到正常阶段并达到 100% 并且 docker 自行杀死并重新启动后,它也未能释放未使用的内存。

我还在 EB 中启用了自动缩放功能来处理大量请求。因此,只有在运行实例的 CPU 使用率达到最大值后,它才会创建另一个重复实例。

一旦内存使用量达到其最大限制(即 512mb 中的 500mb),我如何设置自动缩放以创建另一个实例?

请尽快为我们提供解决这些问题的解决方案/方法,因为这对我们来说是一个非常关键的问题?

【问题讨论】:

【参考方案1】:

CloudWatch 本身不会报告内存统计信息。但是亚马逊提供了一些脚本(通常简称为“Linux 的 CloudWatch 监控脚本”),它们会将统计信息输入 CloudWatch,以便您可以使用这些指标来构建扩展策略。

Elastic Beanstalk 文档在http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-cw.html 提供了一些有关在 Linux 平台上安装脚本的信息。

但是,这将带来另一个警告,即您不能使用本机 Docker 部署 JSON,因为它不会获取 .ebextensions 文件夹(请参阅 Where to put ebextensions config in AWS Elastic Beanstalk Docker deploy with dockerrun source bundle?)。此处的解决方案是创建一个包含 JSON 文件和 .ebextensions 文件夹的应用程序的 zip,并将其用作部署工件。

还有一件事我不清楚,那就是这些指标是否可以在应用程序的“配置”->“缩放”部分下进行选择。您可能需要创建另一个 .ebextensions 配置文件来设置自定义指标,例如:

option_settings:
  aws:elasticbeanstalk:customoption:
    BreachDuration: 3
    LowerBreachScaleIncrement: -1
    MeasureName: MemoryUtilization
    Period: 60
    Statistic: Average
    Threshold: 90
    UpperBreachScaleIncrement: 2

现在,即使这可行,如果应用程序在扩展和负载下降后不会降低其内存使用量,那么扩展策略将继续触发并最终达到最大实例。

我会先看看您是否可以获取 JVM 的一些垃圾收集统计信息,并可能调整 JVM 以更频繁地进行垃圾收集,以帮助在应用程序负载下降后更快地降低内存。

【讨论】:

以上是关于一旦我的 docker 达到其最大内存限制,AWS EB 应该创建新实例的主要内容,如果未能解决你的问题,请参考以下文章

Docker: 限制容器可用的内存

Docker 容器达到 Memory Limit 后的行为

是否可以从 Docker 映像创建 AWS AMI?

增加电子内存限制

docker资源限制

docker内存及cpu限制(不断总结中)