Весенние загрузочные микро сервисы, занимающие много памяти в Docker-Swarm - PullRequest
0 голосов
/ 11 октября 2018

У меня есть несколько Docker Swarm контейнеров, работающих на Ubuntu 16.04.4 LTS экземпляр на Azure .Контейнеры работают с приложениями Java Spring Boot и Netflix OSS, такими как Eureka, Ribbon, Gateway и т. Д.Я заметил, что мой контейнер занимает огромный объем памяти, хотя сервисы являются просто конечной точкой REST.

Я пытался ограничить потребление памяти, передавая аргументы Java VM, как показано ниже, но это не помогло, размер не получилизменилось даже после.

Обратите внимание, что ниже конфигурация, которую я здесь использую,

Версия Java: Java 8 Alpine

Версия ядра: 4.15.0-1023-azure

Операционная система: Ubuntu 16.04.4 LTS

OSType: linux

Архитектура: x86_64

Процессоры: 32

Общий объем памяти: 125,9 ГБ

Объем памяти после docker stats

docker stats

Аргументы Java VM,

docker service create --name xxxxxx-service --replicas 1 --network overnet 127.0.0.1:5000/xxxxxx-service --env JAVA_OPTS="-Xms16m -Xmx32m -XX:MaxMetaspaceSize=48m -XX:CompressedClassSpaceSize=8m -Xss256k -Xmn8m -XX:InitialCodeCacheSize=4m -XX:ReservedCodeCacheSize=8m -XX:MaxDirectMemorySize=16m -XX:+UseCGroupMemoryLimitForHeap -XX:-ShrinkHeapInSteps -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=70"

Я пробовалпосмотреть на файлы журнала приложения в каждом из контейнеров, но не могу найти никаких ошибок, связанных с памятью.Я также пытался ограничить ресурсы контейнера.Но это также не сработало для меня.

Ограничить ресурсы контейнера

Есть какие-нибудь подсказки, как я могу устранить эту проблему с нехваткой памяти?

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Еще один способ узнать больше, что я использовал в прошлом, это использовать Время загрузки AspectJ , чтобы добавить специальный код, который добавляет информацию о памяти в ваши файлы журнала.Это также замедлит работу вашей системы, но когда ваши аспекты написаны не так сильно, как использование профиля.

Если возможно, будет предпочтительнее профилирование - если нет, то AspectJ может помочь в определении времени загрузки.

0 голосов
/ 11 октября 2018

Вы можете попробовать включить привод и сравнить значения потребления памяти со значениями, сгенерированными статистикой Docker.

, чтобы включить привод, вы можете добавить следующую зависимость в ваш файл pom.xml.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Обычно я использую HAL-браузер для мониторинга приложения и использования конечных точек привода.Вы можете добавить это, используя следующую зависимость maven.

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-rest-hal-browser</artifactId>
</dependency>

В браузере HAL вы можете попробовать использовать конечную точку /metrics для вашего приложения.

Пример вывода будет выглядеть следующим образом.

{
    "mem" : 193024,
    "mem.free" : 87693,
    "processors" : 4,
    "instance.uptime" : 305027,
    "uptime" : 307077,
    "systemload.average" : 0.11,
    "heap.committed" : 193024,
    "heap.init" : 124928,
    "heap.used" : 105330,
    "heap" : 1764352,
    "threads.peak" : 22,
    "threads.daemon" : 19,
    "threads" : 22,
    "classes" : 5819,
    "classes.loaded" : 5819,
    "classes.unloaded" : 0,
    "gc.ps_scavenge.count" : 7,
    "gc.ps_scavenge.time" : 54,
    "gc.ps_marksweep.count" : 1,
    "gc.ps_marksweep.time" : 44,
    "httpsessions.max" : -1,
    "httpsessions.active" : 0,
    "counter.status.200.root" : 1,
    "gauge.response.root" : 37.0
}

таким образом вы можете отслеживать производительность памяти вашего приложения и узнавать, сколько памяти фактически использует ваше приложение.Если это аналогично отчету, сгенерированному Docker, то это проблема вашего кода.

Однако я должен сказать, что использование исполнительного механизма не является дружественным к производственным процессам, поскольку само по себе требует значительных ресурсов.

0 голосов
/ 11 октября 2018

Вы можете устранить эту проблему, используя профилировщик, такой как visualvm или jprofiler, он покажет вам, где выделена память (какие типы объектов и т. Д.).

Не следует использовать ее на производствеХотя система, если возможно, потому что профилирование может быть очень загруженным процессором.

...