Spring Cloud微服务内存使用情况

时间:2016-08-03 15:15:13

标签: performance memory docker spring-cloud

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

我试图通过这样做来限制这些容器可以使用的内存量:

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

此时我的服务(带有一个单一端点的标准Spring云服务,使用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)
  • 泊坞
  • Spring数据Redis 1.7.1

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

2 个答案:

答案 0 :(得分:3)

我们根据JVM本身研究了类似设置中的许多内容。如果使用Java 8,快速保存内存的方法是使用以下选项:

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

G1GC已有详细记录,UseStringDeduplication通过对堆中的Strings存储进行重复数据删除来减少堆使用(我们在JSON / XML Web服务类型环境中发现了大约20%),并且TieredCompilation在使用CodeCache(从70Mb到10Mb),以及大约10%的Metaspace,大约10%的启动时间。

答案 1 :(得分:-1)

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

例如: JAVA_OPTS = -Xmx64m

相关问题