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