|
@@ -0,0 +1,115 @@
|
|
|
|
|
+#!/usr/bin/env sh
|
|
|
|
|
+set -eu
|
|
|
|
|
+
|
|
|
|
|
+OUTPUT_FILE="${1:-}"
|
|
|
|
|
+if [ -z "$OUTPUT_FILE" ]; then
|
|
|
|
|
+ echo "用法: scripts/docker-limits.sh <output-compose-override.yml>" >&2
|
|
|
|
|
+ exit 1
|
|
|
|
|
+fi
|
|
|
|
|
+
|
|
|
|
|
+detect_cpus() {
|
|
|
|
|
+ if command -v nproc >/dev/null 2>&1; then
|
|
|
|
|
+ nproc
|
|
|
|
|
+ return
|
|
|
|
|
+ fi
|
|
|
|
|
+ if command -v getconf >/dev/null 2>&1; then
|
|
|
|
|
+ getconf _NPROCESSORS_ONLN
|
|
|
|
|
+ return
|
|
|
|
|
+ fi
|
|
|
|
|
+ if command -v sysctl >/dev/null 2>&1; then
|
|
|
|
|
+ sysctl -n hw.ncpu
|
|
|
|
|
+ return
|
|
|
|
|
+ fi
|
|
|
|
|
+ echo 2
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+detect_memory_mb() {
|
|
|
|
|
+ if [ -r /proc/meminfo ]; then
|
|
|
|
|
+ awk '/MemTotal/ { printf "%d\n", $2 / 1024 }' /proc/meminfo
|
|
|
|
|
+ return
|
|
|
|
|
+ fi
|
|
|
|
|
+ if command -v sysctl >/dev/null 2>&1; then
|
|
|
|
|
+ sysctl -n hw.memsize | awk '{ printf "%d\n", $1 / 1024 / 1024 }'
|
|
|
|
|
+ return
|
|
|
|
|
+ fi
|
|
|
|
|
+ echo 4096
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+cpu_value() {
|
|
|
|
|
+ awk -v total="$1" -v share="$2" 'BEGIN {
|
|
|
|
|
+ value = total * 0.80 * share / 100;
|
|
|
|
|
+ if (value < 0.10) value = 0.10;
|
|
|
|
|
+ printf "%.2f", value;
|
|
|
|
|
+ }'
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+memory_value() {
|
|
|
|
|
+ awk -v total="$1" -v share="$2" 'BEGIN {
|
|
|
|
|
+ value = int(total * 0.50 * share / 100);
|
|
|
|
|
+ if (value < 96) value = 96;
|
|
|
|
|
+ printf "%dm", value;
|
|
|
|
|
+ }'
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+integer_at_least_one() {
|
|
|
|
|
+ awk -v value="$1" 'BEGIN {
|
|
|
|
|
+ n = int(value);
|
|
|
|
|
+ if (n < 1) n = 1;
|
|
|
|
|
+ printf "%d", n;
|
|
|
|
|
+ }'
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+CPUS="$(detect_cpus)"
|
|
|
|
|
+MEMORY_MB="$(detect_memory_mb)"
|
|
|
|
|
+BUILD_CPUS="$(integer_at_least_one "$(awk -v total="$CPUS" 'BEGIN { print total * 0.80 }')")"
|
|
|
|
|
+NODE_OLD_SPACE_MB="$(awk -v total="$MEMORY_MB" 'BEGIN {
|
|
|
|
|
+ value = int(total * 0.50 * 0.25);
|
|
|
|
|
+ if (value < 512) value = 512;
|
|
|
|
|
+ printf "%d", value;
|
|
|
|
|
+}')"
|
|
|
|
|
+
|
|
|
|
|
+mkdir -p "$(dirname "$OUTPUT_FILE")"
|
|
|
|
|
+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)"
|
|
|
|
|
+ pids_limit: 512
|
|
|
|
|
+
|
|
|
|
|
+ redis:
|
|
|
|
|
+ cpus: "$(cpu_value "$CPUS" 5)"
|
|
|
|
|
+ mem_limit: "$(memory_value "$MEMORY_MB" 5)"
|
|
|
|
|
+ memswap_limit: "$(memory_value "$MEMORY_MB" 5)"
|
|
|
|
|
+ pids_limit: 256
|
|
|
|
|
+
|
|
|
|
|
+ rabbitmq:
|
|
|
|
|
+ cpus: "$(cpu_value "$CPUS" 15)"
|
|
|
|
|
+ mem_limit: "$(memory_value "$MEMORY_MB" 15)"
|
|
|
|
|
+ memswap_limit: "$(memory_value "$MEMORY_MB" 15)"
|
|
|
|
|
+ pids_limit: 512
|
|
|
|
|
+
|
|
|
|
|
+ backend:
|
|
|
|
|
+ cpus: "$(cpu_value "$CPUS" 50)"
|
|
|
|
|
+ mem_limit: "$(memory_value "$MEMORY_MB" 45)"
|
|
|
|
|
+ memswap_limit: "$(memory_value "$MEMORY_MB" 45)"
|
|
|
|
|
+ pids_limit: 1024
|
|
|
|
|
+ build:
|
|
|
|
|
+ args:
|
|
|
|
|
+ MAVEN_OPTS: "-XX:ActiveProcessorCount=$BUILD_CPUS -XX:MaxRAMPercentage=50 -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)"
|
|
|
|
|
+ pids_limit: 256
|
|
|
|
|
+ build:
|
|
|
|
|
+ args:
|
|
|
|
|
+ NODE_OPTIONS: "--max-old-space-size=$NODE_OLD_SPACE_MB"
|
|
|
|
|
+EOF
|
|
|
|
|
+
|
|
|
|
|
+echo "已生成 Docker 资源限制: $OUTPUT_FILE"
|
|
|
|
|
+echo "宿主机 CPU: $CPUS, Docker CPU 总预算: 80%"
|
|
|
|
|
+echo "宿主机内存: ${MEMORY_MB}MB, Docker 内存总预算: 50%"
|