繁体   English   中英

Spring 引导服务部署使用 Docker-compose - memory 问题:资源耗尽事件

[英]Spring boot services deploying using Docker-compose - memory issue: Resource exhaustion event

我正在使用 spring-boot 微服务构建应用程序并部署到 docker 容器中。 我正在使用 docker-compose 机制将服务部署到容器中。

  • 我的 docker 设置在 Windows-10 家庭版上。
  • WSL2 设置也已启用。

我在用:

  • 采用OpenJDK 11.0.10+9
  • Spring开机2.4.2
  • Docker桌面引擎20.10.5
  • 编写 1.29.0

当我要使用docker-compose up命令将应用程序部署到容器中时,部署时其中一项服务出现以下错误。

资源耗尽事件:JVM 无法从堆中分配 memory。

并打印一些数据。

我已经修改了 WSL2 的 docker 设置,并为它分配了更多的 memory 从 4GB 到 8GB,但仍然失败。

在分析日志时,我发现了一件事:

部署的服务未采用 docker-compose 文件中提到的 memory。 以下是日志和文件:

日志:

springboot-naming-server_1       | Calculated JVM Memory Configuration: -XX:MaxDirectMemorySize=10M -Xmx86677K -XX:MaxMetaspaceSize=118122K -XX:ReservedCodeCacheSize=240M -Xss1M (Total Memory: 700M, Thread Count: 250, Loaded Class Count: 18441, Headroom: 0%)
springboot-api-gateway_1         | Calculated JVM Memory Configuration: -XX:MaxDirectMemorySize=10M -Xmx290293K -XX:MaxMetaspaceSize=119306K -XX:ReservedCodeCacheSize=240M -Xss1M (Total Memory: 700M, Thread Count: 50, Loaded Class Count: 18650, Headroom: 0%)
role-service_1                   | Calculated JVM Memory Configuration: -XX:MaxDirectMemorySize=10M -Xmx69418K -XX:MaxMetaspaceSize=135381K -XX:ReservedCodeCacheSize=240M -Xss1M (Total Memory: 700M, Thread Count: 250, Loaded Class Count: 21488, Headroom: 0%)
user-service_1                   | Calculated JVM Memory Configuration: -XX:MaxDirectMemorySize=10M -Xmx48733K -XX:MaxMetaspaceSize=156066K -XX:ReservedCodeCacheSize=240M -Xss1M (Total Memory: 700M, Thread Count: 250, Loaded Class Count: 25140, Headroom: 0%)

-Xmx值不同。 容器 memory 已分配。

Docker-compose 文件:

version: '3.8'

services:
  rabbitmq:
    image: rabbitmq:3.8.14-management
    mem_limit: 300m
    ports:
      - "5672:5672"
      - "15672:15672"
    networks:
      - test-network

  zipkin-server:
    image: openzipkin/zipkin:2.23
    ports:
      - "9411:9411"
    deploy:
      resources:
        limits:
          cpus: 0.15
          memory: 300m
    networks:
      - test-network
    depends_on:
      - rabbitmq
    restart: unless-stopped
    environment:
      - RABBIT_URI=amqp://guest:guest@rabbitmq:5672
    
  redis-cache-server:
    image: redis
    command: ['redis-server', '--requirepass', 'aaaxxxcccvvv']
    deploy:
      resources:
        limits:
          memory: 356m
    ports:
      - "6379:6379"
    networks:
      - test-network

  springboot-naming-server:
    image: myapp/test-app-naming-server:1.0
    deploy:
      resources:
        limits:
          cpus: 0.15
          memory: 700m
    ports:
      - "8761:8761"
    networks:
      - test-network
      
  springboot-api-gateway:
    image: myapp/test-app-api-gateway:1.0
    deploy:
      resources:
        limits:
          cpus: 0.15
          memory: 700m
    ports:
      - "8765:8765"
    networks:
      - test-network
    depends_on: 
      - springboot-naming-server
      - rabbitmq
    environment:
      - EUREKA.CLIENT.SERVICEURL.DEFAULTZONE=http://springboot-naming-server:8761/eureka
      - RABBIT_URI=amqp://guest:guest@rabbitmq:5672
      - SPRING_RABBITMQ_HOST=rabbitmq
      - SPRING_ZIPKIN_SENDER_TYPE=rabbit

  role-service:
    image: myapp/test-roleservice:1.0
    deploy:
      resources:
        limits:
          memory: 700m
    ports:
      - "8083:8083"
    networks:
      - test-network
    depends_on: 
      - springboot-naming-server
      - springboot-api-gateway
      - rabbitmq
    environment:
      - EUREKA.CLIENT.SERVICEURL.DEFAULTZONE=http://springboot-naming-server:8761/eureka
      - SPRING.ZIPKIN.BASE-URL=http://zipkin-server:9411
      - RABBIT_URI=amqp://guest:guest@rabbitmq:5672
      - SPRING_RABBITMQ_HOST=rabbitmq
      - SPRING_ZIPKIN_SENDER_TYPE=rabbit
            
  user-service:
    image: myapp/test-userservice:1.0
    deploy:
      resources:
        limits:
          memory: 700m
    ports:
      - "8084:8084"
    networks:
      - test-network
    depends_on: 
      - springboot-naming-server
      - springboot-api-gateway
      - redis-cache-server
      - rabbitmq   
    environment:
      - EUREKA.CLIENT.SERVICEURL.DEFAULTZONE=http://springboot-naming-server:8761/eureka
      - SPRING.ZIPKIN.BASE-URL=http://zipkin-server:9411
      - RABBIT_URI=amqp://guest:guest@rabbitmq:5672
      - SPRING_RABBITMQ_HOST=rabbitmq
      - SPRING_ZIPKIN_SENDER_TYPE=rabbit

  web-app:
    build:
      context: .
      dockerfile: Dockerfile.Web
    ports: 
      - "8081:8080"
    networks:
      - test-network
    depends_on: 
      - springboot-naming-server
      - springboot-api-gateway
      - redis-cache-server
      - rabbitmq      
    command: ['catalina.sh', 'run']
    environment:
      - EUREKA.CLIENT.SERVICEURL.DEFAULTZONE=http://springboot-naming-server:8761/eureka
      - SPRING.REDIS.HOST=redis-cache-server
      - SPRING.ZIPKIN.BASE-URL=http://zipkin-server:9411
      - RABBIT_URI=amqp://guest:guest@rabbitmq:5672
      - SPRING_RABBITMQ_HOST=rabbitmq
      - SPRING_ZIPKIN_SENDER_TYPE=rabbit
    
networks:
  test-network:

我无法理解为什么每个服务都不会平等地获得 memory。 正因为如此,我的最后一个服务“userservice”总是失败,并出现与 momory 相关的错误(上面已经提到过)。

有人可以给我一些指示,我需要检查与 docker 或 spring-boot 等相关的任何配置或设置。

谢谢,

阿图尔

我能够解决它。

问题就像我在问题中提到的那样。 While at the time of startup each service takes lot of memory (see the logs in the question section), so there is no memory remaining for rest of the services and because of that rest of the service failed while starting with the message related to memory .

我对 docker-compse.yml 文件所做的更改是:

environment:
      - JAVA_TOOL_OPTIONS=-Xmx128000K
deploy:
  resources:
    limits:
      memory: 800m

我进行了这 2 项更改,然后根据要求分配了 memory 分配,现在每个服务都开始了。

我发现(可能是错误的观察)docker 组成启动它只寻找该服务的服务并分配 memory。 当其他服务寻找 memory 时,他们未能获得 memory,因为早期的服务几乎占用了很多 memory。

谢谢,

阿图尔

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM