生产环境使用了微服务部署,如何合理分配docker服务器资源

Blade 未结 1 16
334246546
悬赏:10

1、目前问题:
没给容器设置cpu  内存 限制,经常性出现服务器资源使用率很低,但是用户使用卡死情况。

检查,当使用人数达超过200人的时候就会出现这种情况。  检查数据库没用语句挂起,top 命令 线程数只有8  CPU使用率  20-30%
做的是业务系统,最高在线人数700人。

2、目前服务器配置:
目前两台32核心64G内存作为应用服务器,1台32核64G内存作为mysql数据库服务器。
nacos 做了集群,radis做了集群 , mq服务没做集群


现在是在原来的服务上,增加了   business 服务,作为业务操作。    mq-service  作为业务异步处理投递到mq。
mq-consumer  作为消费者处理mq任务。

image.png


现在有两个客户骂街,一直查不出问题,咨询一下大神如何合理分配资源?   
平时使用所有接口保存接口都是  0.几秒,  部分查询接口2秒内。

是否可以通过docker  合理点分配服务器资源能  解决这个问题,为什么服务器cpu没上去  却出现 卡死现象。

能否帮我列一下,每个容器  给多少cpus  内存合适????拜托拜托




1条回答
  • 你提到的cpu不高但是卡死的情况,会有多种可能性

     1. 内存溢出或频繁gc:docker没限制内存,java进程可能会占用过多物理内存导致oom,或者jvm持续回收内存,线程暂停导致卡死

     2. 线程池耗尽:数据库连接池最大线程数设置太小,当请求多人多了,会消耗掉连接池线程,后续的请求都在等待io,就造成了卡死的情况

     3. 连接数限制:应用服务器 ulimit(最大句柄数)以及 undertow/tomcat 的最大连接数较小,导致请求都在等待

     

    尝试解决上面的问题,可以这么调整配置测试下:

     1. docker部署层面限制每个服务的cpu以及内存

     2. java服务层面配置容器的线程、数据库连接


    dockerfile的脚本可以大改参考改成这样:

    FROM bladex/alpine-java:openjdk17_cn_slim
    
    LABEL maintainer="bladejava@qq.com"
    
    RUN mkdir -p /blade
    
    WORKDIR /blade
    
    EXPOSE 8888
    
    COPY ./target/blade-business.jar ./app.jar
    
    # 关键修改:在 -jar 之前加入 -Xms4g -Xmx4g
    ENTRYPOINT ["java", \
                "-Xms4g", \
                "-Xmx4g", \
                "--add-opens", "java.base/java.lang=ALL-UNNAMED", \
                "--add-opens", "java.base/java.lang.reflect=ALL-UNNAMED", \
                "-Djava.security.egd=file:/dev/./urandom", \
                "-jar", "app.jar"]
    
    CMD ["--spring.profiles.active=test"]


    docker-compose.yml部署的脚本可以大改参考改成这样:

    version: "3.9"
    services:
      business:
        image: your-business-image:latest
        deploy:
          resources:
            limits:
              cpus: "4"
              memory: 4G
            reservations:
              cpus: "2"
              memory: 2G
        environment:
          - JAVA_TOOL_OPTIONS=-Xms4g -Xmx4g
        # ports, networks, etc.
    
      mq-service:
        image: your-mq-service-image:latest
        deploy:
          resources:
            limits:
              cpus: "2"
              memory: 2G
            reservations:
              cpus: "1"
              memory: 1G
        environment:
          - JAVA_TOOL_OPTIONS=-Xms1.5g -Xmx1.5g
    
      mq-consumer:
        image: your-mq-consumer-image:latest
        deploy:
          resources:
            limits:
              cpus: "4"
              memory: 3G
            reservations:
              cpus: "2"
              memory: 1.5G
        environment:
          - JAVA_TOOL_OPTIONS=-Xms2g -Xmx2g


    可适当调整容器线程数

    server:
      port: 80
      undertow:
        threads:
          # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
          io: 16 
          # Worker线程:负责处理阻塞业务(即你的 Controller 逻辑)。
          # 建议:由于你是业务系统且有卡死现象,可以增加到 800-1000。
          worker: 800 
        # 默认值通常是根据内存计算的,建议设置为 16384 (16KB) 或更大,减少磁盘/网络 IO 次数。
        buffer-size: 16384
        # 直接内存分配,建议保持 true 以提升 IO 性能
        direct-buffers: true


    数据库连接池适当调整

    spring:
      datasource:
        druid:
          # 初始连接数:建议设为 10-20,减少启动后的波动
          initial-size: 20
          # 最小空闲连接数:保持与初始一致
          min-idle: 20
          # 建议:单实例设为 100-200。如果你有 4 个微服务实例,总连接在就 400-800
          max-active: 150
          # 超时快速失败,方便通过监控发现瓶颈。
          max-wait: 60000
          # 建议开启:空闲连接检测
          test-while-idle: true
          # 归还/借用时不校验,提升性能
          test-on-borrow: false
          test-on-return: false
          # 检测连接是否有效的超时时间
          validation-query-timeout: 3000


    0 讨论(0)
提交回复