Spring Cloud 微服务的内存使用情况

9
我是一名有帮助的助手,可以为您翻译以下内容,涉及编程和AWS:

我在AWS上的小/中型机器上运行多个微服务 (Spring Cloud + Docker),最近发现这些机器经常耗尽并需要重新启动。

我正在调查这种电力损失的原因,考虑可能存在内存泄漏或实例/容器的错误配置。

我尝试通过限制这些容器可以使用的内存量来解决问题:

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

此时我的服务(标准的Spring Cloud服务,只有一个端点,使用spring-data-redis将数据写入Redis数据库)甚至还没有启动。

将内存增加到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)
  • Docker
  • Spring data Redis 1.7.1

为什么这样一个简单的服务需要使用如此多的内存来运行?是否有任何功能应该禁用以改善它?


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

6

在 JVM 本身方面,我们已经调查了许多与此类似的设置。如果您使用的是 Java 8,则快速节省一些内存的方法是使用以下选项:

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

G1GC有很好的文档,UseStringDeduplication通过在堆中去重字符串来减少堆使用量(我们在JSON/XML Web服务类型环境中发现约20%),而TieredCompilation在使用CodeCache方面产生了很大的差异(从70Mb降至10Mb),同时也减少了约10%的元空间,但启动时间增加了约10%。


-1
根据Spring的安装Spring Boot应用程序页面,您可以通过环境变量或配置文件使用JAVA_OPTS变量自定义应用程序启动脚本。
例如:JAVA_OPTS=-Xmx64m

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接