linux - AWS beanstalk 中 docker 容器中的 JVM 内存设置

标签 linux amazon-web-services docker jvm amazon-elastic-beanstalk

我在 docker 容器中运行我的 java 应用程序。我使用 AWS Beanstalk。 docker 基础镜像是 CentOS。我在用于 Beanstalk 的 Amazon Linux AMI 上使用 4gb RAM 在 EC2 实例上运行容器。

我应该如何配置容器和 JVM 内存设置。 现在我有:

Amazon Linux Beanstalk AMI ec2 实例上 4GB

我为 docker 容器专用了 3GB,共 4 个

{
  "AWSEBDockerrunVersion": 2,
  "Authentication": {
    "Bucket": "elasticbeanstalk-us-east-1-XXXXXX",
    "Key": "dockercfg"
  },
  "containerDefinitions": [
    {
      "name": "my-service",
      "image": "docker-registry:/myapp1.0.2",
      "essential": true,
      "memory": 3184,
      "portMappings": [
        {
          "hostPort": 80,
          "containerPort": 8080
        }
      ]
    }
}

JVM 设置是

  -Xms2560m
  -Xmx2560m
  -XX:+UseConcMarkSweepGC
  -XX:+CMSParallelRemarkEnabled
  -XX:+UseCMSInitiatingOccupancyOnly
  -XX:CMSInitiatingOccupancyFraction=70
  -XX:+ScavengeBeforeFullGC
  -XX:+CMSScavengeBeforeRemark
  -XX:+HeapDumpOnOutOfMemoryError
  -XX:HeapDumpPath=./heapdump.hprof

我可以将整个 ec2 实例内存专用于 docker 容器,4gb,并将 JVM 也设置为 4GB 吗?

我认为当 JVM 无法分配 Xmx 内存参数所说的任何内容时,它可能会崩溃。如果是这样,我可以为容器和 JVM 使用的最佳值是多少?

现在我为 Amazon Linux 本身留下了 1GB 的余量,为在容器中运行的 CentOS 留出了 512MB。 1.5GB 浪费了。可以做得更好吗?

最佳答案

真正的答案在很大程度上取决于您的 Java 应用程序和使用情况。

从 3.5G 的 JVM 堆开始。
将容器最大值设置为 3.8G 以覆盖 java 的开销。
负载测试,反复。

Java

-Xmx-Xms 只控制Java's heap size因此您不能将所有可用内存分配给 Java 的堆并期望 Java 和系统的其余部分运行良好(或根本无法运行)。

您还需要满足:

堆栈:-Xss * 线程数(Xss 在 64 位上默认为 1MB)

PermGen/Metaspace:-XX:MaxPermSize 默认为 64MB。 Metaspace 到 21MB 但这可以增长。

您的应用程序还可以使用大量共享内存,在堆外执行 JNI 操作,依赖大型 mmaped 文件来提高性能或 exec 外部二进制文件或堆外的任何其他怪事。在您选择的内存级别进行一些负载测试,然后在这些级别之上和之下进行测试,以确保您不会遇到或接近任何影响性能的内存问题。

容器

Centos 本身并不在容器中“运行”,docker 只是提供一个文件系统镜像供您的 JVM 进程引用。通常,您不会“运行”该容器中的 java 进程。

当您在只有一个容器的专用主机上时,限制容器最大内存并没有太大好处,但它也不会造成任何伤害,以防 native java 中的某些内容耗尽可用内存。

这里的内存开销需要满足上面提到的可能的原生 Java 使用以及将从容器镜像(而不是主机)加载并缓存的 jre 的额外系统文件。当您达到容器内存限制时,您也不会获得良好的堆栈或堆转储。

操作系统

一个普通的 Amazon AMI 只需要大约 50-60MB 的内存来运行加上一些备用的文件缓存,所以说 256MB 来覆盖操作系统有一些余地。

关于linux - AWS beanstalk 中 docker 容器中的 JVM 内存设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37725657/

相关文章:

reactjs - 无法构建 react 项目AWS

java - 如何使用maven创建示例Openwhisk-Java应用程序并为其创建Docker镜像

linux - 网络实验室的配置

java - PowerMock PrepareForTest 注释导致 AmazonSQSClient 构造函数出现问题

linux - 后台进程在 Linux 上完成工作后的清理

ruby - rbenv 无法安装 rubinius

docker - gcloud ai平台Hypertune将环境变量传递给自定义容器

docker - Windows 服务器上的 Docker 是 "free"吗?

linux - 有没有一种自动的方法来找出共享对象依赖关系?

ios - 从linux命令行编译IOS程序