Procházet zdrojové kódy

bugfix: 修改RabbitMQ的限制,防止启动失败
feature: 更加宽松的内存限制

zbLiuLiu před 1 týdnem
rodič
revize
57672705f2

+ 1 - 1
README.md

@@ -21,7 +21,7 @@ scripts/dev-up.sh
 - 后端:http://localhost:8080
 - Swagger UI:http://localhost:8080/swagger-ui.html
 
-启动脚本会生成 `storage/runtime/docker-compose.limits.yml` 并叠加启动:Docker 项目总 CPU 预算按宿主机 80% 计算,其它主要运行资源按宿主机 50% 计算,构建过程默认串行,降低服务器构建卡死风险。
+启动脚本会生成 `storage/runtime/docker-compose.limits.yml` 并叠加启动:Docker 项目总 CPU 预算按宿主机 80% 计算,其它主要运行资源按宿主机 65% 计算,构建过程默认串行,降低服务器构建卡死风险。
 - 健康检查:http://localhost:8080/actuator/health
 
 停止:

+ 3 - 0
deploy/docker-compose.yml

@@ -34,9 +34,12 @@ services:
     environment:
       RABBITMQ_DEFAULT_USER: hr_app
       RABBITMQ_DEFAULT_PASS: hr_app_password
+      RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS: "+S 2:2 +sbwt none +sbwtdcpu none +sbwtdio none"
     ports:
       - "5672:5672"
       - "15672:15672"
+    volumes:
+      - ./rabbitmq.conf:/etc/rabbitmq/conf.d/20-hr-lab.conf:ro
     healthcheck:
       test: ["CMD", "rabbitmq-diagnostics", "ping"]
       interval: 10s

+ 3 - 0
deploy/rabbitmq.conf

@@ -0,0 +1,3 @@
+vm_memory_high_watermark.relative = 0.60
+disk_free_limit.relative = 1.0
+collect_statistics_interval = 10000

+ 3 - 2
docs/deployment-guide.md

@@ -9,9 +9,10 @@ scripts/dev-up.sh
 `dev-up.sh` 会先生成 `storage/runtime/docker-compose.limits.yml`,再叠加到主 Compose 文件启动服务。默认策略:
 
 - Docker 项目总 CPU 预算按宿主机可用 CPU 的 80% 计算,并分配给数据库、中间件、后端和前端。
-- Docker 项目总内存预算按宿主机内存的 50% 计算,并为每个服务设置 `mem_limit` 与 `memswap_limit`。
+- Docker 项目总内存预算按宿主机内存的 65% 计算,并为每个服务设置 `mem_limit` 与 `memswap_limit`。
 - Compose 构建默认串行执行,降低服务器构建时的资源尖峰。
-- 后端 Maven 构建使用 `MAVEN_OPTS` 限制 Java 构建进程的可见 CPU 与堆内存比例;前端 Node 构建使用 `NODE_OPTIONS` 限制 V8 老生代内存。
+- 后端 Maven 构建使用 `MAVEN_OPTS` 限制 Java 构建进程的可见 CPU 与堆内存;前端 Node 构建使用 `NODE_OPTIONS` 限制 V8 老生代内存。
+- RabbitMQ 单独保留更高的最低内存,并通过 `deploy/rabbitmq.conf` 设置内存水位,避免受限容器中 Erlang 监控进程因资源过紧退出。
 
 如需查看实际限制值:
 

+ 24 - 19
scripts/docker-limits.sh

@@ -44,9 +44,9 @@ cpu_value() {
 }
 
 memory_value() {
-  awk -v total="$1" -v share="$2" 'BEGIN {
-    value = int(total * 0.50 * share / 100);
-    if (value < 96) value = 96;
+  awk -v total="$1" -v share="$2" -v minimum="${3:-96}" 'BEGIN {
+    value = int(total * 0.65 * share / 100);
+    if (value < minimum) value = minimum;
     printf "%dm", value;
   }'
 }
@@ -62,9 +62,14 @@ integer_at_least_one() {
 CPUS="$(detect_cpus)"
 MEMORY_MB="$(detect_memory_mb)"
 BUILD_CPUS="$(integer_at_least_one "$(awk -v total="$CPUS" 'BEGIN { print total * 0.80 }')")"
+MAVEN_HEAP_MB="$(awk -v total="$MEMORY_MB" 'BEGIN {
+  value = int(total * 0.65 * 0.41 * 0.70);
+  if (value < 768) value = 768;
+  printf "%d", value;
+}')"
 NODE_OLD_SPACE_MB="$(awk -v total="$MEMORY_MB" 'BEGIN {
-  value = int(total * 0.50 * 0.25);
-  if (value < 512) value = 512;
+  value = int(total * 0.65 * 0.10 * 0.70);
+  if (value < 256) value = 256;
   printf "%d", value;
 }')"
 
@@ -73,37 +78,37 @@ cat > "$OUTPUT_FILE" <<EOF
 services:
   postgres:
     cpus: "$(cpu_value "$CPUS" 20)"
-    mem_limit: "$(memory_value "$MEMORY_MB" 25)"
-    memswap_limit: "$(memory_value "$MEMORY_MB" 25)"
+    mem_limit: "$(memory_value "$MEMORY_MB" 24 384)"
+    memswap_limit: "$(memory_value "$MEMORY_MB" 24 384)"
     pids_limit: 512
 
   redis:
     cpus: "$(cpu_value "$CPUS" 5)"
-    mem_limit: "$(memory_value "$MEMORY_MB" 5)"
-    memswap_limit: "$(memory_value "$MEMORY_MB" 5)"
+    mem_limit: "$(memory_value "$MEMORY_MB" 5 128)"
+    memswap_limit: "$(memory_value "$MEMORY_MB" 5 128)"
     pids_limit: 256
 
   rabbitmq:
-    cpus: "$(cpu_value "$CPUS" 15)"
-    mem_limit: "$(memory_value "$MEMORY_MB" 15)"
-    memswap_limit: "$(memory_value "$MEMORY_MB" 15)"
+    cpus: "$(cpu_value "$CPUS" 20)"
+    mem_limit: "$(memory_value "$MEMORY_MB" 20 512)"
+    memswap_limit: "$(memory_value "$MEMORY_MB" 20 512)"
     pids_limit: 512
 
   backend:
-    cpus: "$(cpu_value "$CPUS" 50)"
-    mem_limit: "$(memory_value "$MEMORY_MB" 45)"
-    memswap_limit: "$(memory_value "$MEMORY_MB" 45)"
+    cpus: "$(cpu_value "$CPUS" 45)"
+    mem_limit: "$(memory_value "$MEMORY_MB" 41 768)"
+    memswap_limit: "$(memory_value "$MEMORY_MB" 41 768)"
     pids_limit: 1024
     build:
       args:
-        MAVEN_OPTS: "-XX:ActiveProcessorCount=$BUILD_CPUS -XX:MaxRAMPercentage=50 -Djava.awt.headless=true"
+        MAVEN_OPTS: "-Xmx${MAVEN_HEAP_MB}m -XX:ActiveProcessorCount=$BUILD_CPUS -Djava.awt.headless=true"
     environment:
       JAVA_TOOL_OPTIONS: "-XX:MaxRAMPercentage=50"
 
   frontend:
     cpus: "$(cpu_value "$CPUS" 10)"
-    mem_limit: "$(memory_value "$MEMORY_MB" 10)"
-    memswap_limit: "$(memory_value "$MEMORY_MB" 10)"
+    mem_limit: "$(memory_value "$MEMORY_MB" 10 256)"
+    memswap_limit: "$(memory_value "$MEMORY_MB" 10 256)"
     pids_limit: 256
     build:
       args:
@@ -112,4 +117,4 @@ EOF
 
 echo "已生成 Docker 资源限制: $OUTPUT_FILE"
 echo "宿主机 CPU: $CPUS, Docker CPU 总预算: 80%"
-echo "宿主机内存: ${MEMORY_MB}MB, Docker 内存总预算: 50%"
+echo "宿主机内存: ${MEMORY_MB}MB, Docker 内存总预算: 65%"