亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Spring Boot 微服務在 docker-swarm 中消耗大量內存

Spring Boot 微服務在 docker-swarm 中消耗大量內存

藍山帝景 2021-11-11 15:44:18
我有一些docker swarm 容器在Azure上的Ubuntu 16.04.4 LTS實例上運行。容器正在運行 Java Spring Boot 和 Netflix OSS 應用程序,如 Eureka、Ribbon、Gateway 等應用程序。我觀察到我的容器占用了大量內存,盡管服務只是 REST 端點。我試圖通過像下面這樣傳遞 Java VM 參數來限制內存消耗,但這無濟于事,即使之后大小也沒有改變。請注意下面我在這里使用的配置,Java 版本:Java 8 高山內核版本:4.15.0-1023-azure操作系統:Ubuntu 16.04.4 LTS操作系統類型:linux架構:x86_64CPU:32總內存:125.9GiB之后的內存占用 docker statsJava 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 回答

?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

您可以通過使用諸如visualvm 或jprofiler 之類的分析器來解決此問題,它們會向您顯示分配了內存的位置(哪些類型的對象等)。

如果可能,您不應該在生產系統上使用它,因為分析可能會占用大量 CPU。


查看完整回答
反對 回復 2021-11-11
?
莫回無

TA貢獻1865條經驗 獲得超7個贊

了解我過去使用過的更多信息的另一種方法是使用AspectJ 的加載時間編織來添加特殊代碼,將內存信息添加到您的日志文件中。這也會減慢您的系統速度,但是當您的方面已經被寫入時,不如使用配置文件。

如果可能的話,分析將是首選 - 如果不是,AspectJ 加載時間編織可能會有所幫助。


查看完整回答
反對 回復 2021-11-11
?
翻閱古今

TA貢獻1780條經驗 獲得超5個贊

您可以嘗試啟用執行器并將內存消耗值與 docker stats 生成的值進行比較。


要啟用執行器,您可以在 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 生成的報告類似,那么這就是您的代碼的問題。


但是我必須聲明,執行器的使用不是生產友好的,因為它本身具有顯著的資源開銷。


查看完整回答
反對 回復 2021-11-11
  • 3 回答
  • 0 關注
  • 398 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號