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任务。
现在有两个客户骂街,一直查不出问题,咨询一下大神如何合理分配资源?
平时使用所有接口保存接口都是 0.几秒, 部分查询接口2秒内。
是否可以通过docker 合理点分配服务器资源能 解决这个问题,为什么服务器cpu没上去 却出现 卡死现象。
能否帮我列一下,每个容器 给多少cpus 内存合适????拜托拜托
你提到的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