当前位置: 首页 > 知识库问答 >
问题:

在docker-swarm中消耗大量内存的Spring boot微服务

别峻
2023-03-14

我在Azure上的Ubuntu 16.04.4 LTS实例上运行了一些docker swarm容器。容器运行Java Spring Boot和Netflix OSS应用程序,如Eureka、Ribbon、Gateway等应用程序。我发现我的容器占用了巨大的内存,尽管服务只是RESTendpoint。

我试图通过传递Java VM参数来限制内存消耗,如下所示,但这并没有帮助,大小甚至没有改变。

请在下面备注我在这里使用的配置,

Java版本:Java 8 Alpine

内核版本:4.15.0-1023-azure

操作系统:LTS Ubuntu 16 . 04 . 4

OSType: linux

建筑:x86_64

处理器: 32

总内存:125.9千兆字节

docker stats后的内存占用

Java 虚拟机参数,

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个答案

闽阳州
2023-03-14

您可以尝试启用执行器,并将内存消耗值与docker stats生成的值进行比较。

要启用致动器,您可以在 pom.xml 文件中添加以下依赖项。

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

我通常使用HAL浏览器来监视应用程序并使用执行器endpoint。您可以使用以下 maven 依赖项添加它。

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

在HAL浏览器中,您可以尝试为您的应用程序使用< code>/metricsendpoint。

示例输出如下所示。

{
    "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生成的报告类似,那么这是代码的问题。

然而,我必须声明,执行器的使用对生产并不友好,因为它本身就有很大的资源开销。

司徒钱青
2023-03-14

了解我过去使用过的更多信息的另一种方法是使用AspectJ的加载时编织来添加特殊代码,将内存信息添加到日志文件中。这也会减慢你的系统速度,但当你的方面被写出来时,与其说是使用概要文件,还不如说是使用了概要文件。

如果可能的话,分析会更受欢迎——如果不是AeyJ加载时间编织可能会有所帮助。

顾磊
2023-03-14

您可以使用诸如visualvm或jprofiler之类的分析器来解决这个问题,它们会显示内存分配的位置(对象的类型等)。

但是,如果可能的话,您不应该在生产系统上使用它,因为分析可能会占用大量CPU。

 类似资料:
  • 似乎是正在消耗大量内存,即使在应该释放任何资源之后也是如此。简单的演示 产出: 如果替换部分, 使用率大幅下降: 我在这里误解了什么/做错了什么?正在加载的文件很大(~60MB),但即使XNode需要使用那么多内存,也不应该在时间?

  • 我正在尝试使用Cooja模拟器模拟无线传感器网络。我想观察RPL协议在Contiki-OS中消耗的内存量。我使用sky-mote进行模拟,并创建了一个包含许多它们的网络。有没有什么方法可以观察RPL协议为保留邻居和路由表而消耗的内存量?

  • 我有三个服务的spring-cloud应用程序:Eureka服务器+网关(zuul)+用户服务(2个实例) 在localhost中,所有的东西都在工作,我可以访问: Docker创建了4个容器,所有3个服务都注册在Eureka-Server中: Eureka注册网关和2个用户服务实例 用户服务实例的ip: null application.yml Docker-Compose:

  • 问题内容: 该表包含大约一千万行。 这会导致内存使用量稳定增加到4 GB左右,这时行将快速打印。第一行打印之前漫长的延迟使我感到惊讶–我希望它几乎可以立即打印。 我也尝试过以相同的方式表现。 我不知道Django将什么加载到内存中或为什么这样做。我希望Django在数据库级别遍历结果,这意味着结果将以大致恒定的速率打印(而不是经过漫长的等待一次全部打印)。 我误会了什么? (我不知道它是否相关,但

  • 当我刚接触drools时,我浏览了一些论坛,开发了一个使用KnowledgeBuilder api和StatefulKnowledgeSessions配置drools的应用程序。当时drools文件的数量较少,并且与应用程序打包在一起。分析时,我发现drools消耗了大量内存,内存分配率(TLAB)很高。这让我思考,是否需要有一个缓存解决方案,以避免每次有应用程序请求时都创建KnowledgeSe