【发布时间】: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 并且有时会崩溃,尽管它们不会被使用。我认为微服务应该是轻量级的。但是有了这种内存使用......
标签: performance memory docker spring-cloud