Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring Cloud microservices memory usage

I'm running multiple microservices (Spring cloud + docker) in small/medium machines on AWS and recently I found that these machines are often exhausted and need rebooting. I'm investigating the causes of this loss of power, thinking of possible memory leaks or misconfigurations on the instance/container.

I tried to limit the amount of memory these containers can use by doing:

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

At this point my service (standard spring cloud service with one single endpoint that writes stuff to a Redis DB, using spring-data-redis) didn't even start.

Increased the memory to 760M and it worked, but monitoring it with docker I see the minimum is:

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

I added some parameters to limit the JVM memory heap but it doesn't seem to reduce it very much:

_JAVA_OPTIONS: "-Xms8m -Xss256k -Xmx512m"

I'm running

  • Spring Cloud Brixton.M5
  • Spring Boot 1.3.2
  • Java 8 (Oracle JVM)
  • Docker
  • Spring data Redis 1.7.1

Is there a reason why such simple service uses so much memory to run? Are there any features I should disable to improve that?

like image 286
Amin Abu-Taleb Avatar asked Aug 03 '16 15:08

Amin Abu-Taleb


People also ask

How much RAM does spring boot use?

The Spring Boot autoconfiguration premium, measured this way, is about 1MB heap and 4MB non-heap.

Are spring boots heavy?

Given above reasons, there is no way that Spring Boot can be used as a light weight platform for microservices. It is too heavy and two slow. And if you compare the codebase on both Spring Boot and Light Java, you can see Light Java code is small and easy to understand without any annotations.

Is spring boot good for microservices?

Spring Boot works well with microservices. The Spring Boot artifacts can be deployed directly into Docker containers. However, some developers don't recommend the framework for building large and monolithic apps.


1 Answers

We've investigated a number of things in a similar setup in terms of the JVM itself. A quick way to save some memory if using Java 8 is to use the following options:

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

The G1GC is well documented, the UseStringDeduplication reduces heap usage by de-duplicating the storage of Strings in the heap (we found about 20% in a JSON/XML web service type environment), and the TieredCompilation makes a big difference in the use of CodeCache (from 70Mb down to 10Mb), as well as about 10% less Metaspace at the expense of about 10% startup time.

like image 172
Pete Storey Avatar answered Oct 05 '22 06:10

Pete Storey