Spring Cloud 微服务内存使用情况

Posted

技术标签:

【中文标题】Spring Cloud 微服务内存使用情况【英文标题】:Spring Cloud microservices memory usage 【发布时间】:2016-12-09 09:46:25 【问题描述】:

我在 AWS 上的中小型机器上运行多个微服务(Spring cloud + docker),最近我发现这些机器经常耗尽,需要重新启动。 我正在调查这种断电的原因,考虑实例/容器上可能存在的内存泄漏或配置错误。

我试图通过以下方式限制这些容器可以使用的内存量:

docker run -m 500M --memory-swap 500M -d my-service:latest

此时我的服务(标准 spring 云服务,具有一个单一端点,使用 spring-data-redis 将内容写入 Redis DB)甚至没有启动。

将内存增加到760M 并且它起作用了,但是用docker监控它我看到最小值是:

CONTAINER           CPU %               MEM USAGE / LIMIT       MEM %               NET I/O             BLOCK I/O             PIDS
cd5f64aa371e        0.18%               606.9 MiB / 762.9 MiB   79.55%              102.4 MB / 99 MB    1.012 MB / 4.153 MB   60

我添加了一些参数来限制 JVM 内存堆,但它似乎并没有减少很多:

_JAVA_OPTIONS: "-Xms8m -Xss256k -Xmx512m"

我在跑步

Spring Cloud Brixton.M5 Spring Boot 1.3.2 Java 8 (Oracle JVM) 码头工人 Spring 数据 Redis 1.7.1

这样简单的服务为什么要使用这么多内存来运行是有原因的吗?我应该禁用哪些功能来改进它?

【问题讨论】:

+1 我也遇到了类似的行为。我正在运行一系列运行 Spring Cloud 的微服务,使用 Brixton.RC1,并在 docker 容器中运行(在 docker 1.12 swarm-mode 中运行)。我的容器使用了 800mb 以上的内存。我编辑了我的 Dockerfile 基础镜像,所以它使用 FROM java:8-jre-alpine 而不是我最初使用的非高山 JDK 基础镜像......但这并没有太大帮助。有人有其他想法吗? 我还在我的 RHEL 机器上运行了相同的容器,其中 docker 1.12 和我的个人 Mac 上运行了 Docker for Mac 1.12 beta 21。 RHEL 盒子上的容器使用了大约 800mb 的内存,而我的 mac 上的容器只使用了 350mb 的内存。两个容器都是使用相同的 docker run 命令启动的。 +1。 spring 和 docker 也有同样的问题。在我的服务中,我使用 Hibernate、Spring Data REST、Spring Security、jackson 等。所有这些都消耗超过 350mb-500mb 并且有时会崩溃,尽管它们不会被使用。我认为微服务应该是轻量级的。但是有了这种内存使用...... 【参考方案1】:

我们已经在 J​​VM 本身的类似设置中调查了许多事情。如果使用 Java 8,一种快速节省内存的方法是使用以下选项:

-Xms256m -Xmx512m -XX:-TieredCompilation -Xss256k -XX:+UseG1GC -XX:+UseStringDeduplication

G1GC 有据可查,UseStringDeduplication 通过对堆中字符串的存储进行重复数据删除来减少堆使用(我们在 JSON/XML Web 服务类型环境中发现大约 20%),TieredCompilation 在使用 CodeCache(从 70Mb 降低到 10Mb),以及以大约 10% 的启动时间为代价减少大约 10% 的元空间。

【讨论】:

【参考方案2】:

根据 Spring 的Installing Spring Boot applications page,您可以通过环境变量或带有 JAVA_OPTS 变量的配置文件来自定义应用程序启动脚本。

例如:JAVA_OPTS=-Xmx64m

【讨论】:

以上是关于Spring Cloud 微服务内存使用情况的主要内容,如果未能解决你的问题,请参考以下文章

监控 Google Cloud Run 内存使用情况

万万没想到,Spring Boot 竟然这么耗内存!

spring cloud微服务快速教程之 Spring Cloud Alibaba--sentinel-限流熔断降级

spring cloud Alibaba 阿里微服务 flowable 工作流 自定义表单 模块设计方案

spring cloud 的配置中心config

微服务与Spring Cloud基本概念Spring Cloud版本命名方式与版本选择