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】:
我们已经在 JVM 本身的类似设置中调查了许多事情。如果使用 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 微服务内存使用情况的主要内容,如果未能解决你的问题,请参考以下文章
spring cloud微服务快速教程之 Spring Cloud Alibaba--sentinel-限流熔断降级