| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- #!/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" -v minimum="${3:-96}" 'BEGIN {
- value = int(total * 0.65 * share / 100);
- if (value < minimum) value = minimum;
- 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 }')")"
- 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.65 * 0.25);
- if (value < 1024) value = 1024;
- if (value > 3072) value = 3072;
- 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" 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 128)"
- memswap_limit: "$(memory_value "$MEMORY_MB" 5 128)"
- pids_limit: 256
- rabbitmq:
- 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" 45)"
- mem_limit: "$(memory_value "$MEMORY_MB" 41 768)"
- memswap_limit: "$(memory_value "$MEMORY_MB" 41 768)"
- pids_limit: 1024
- build:
- args:
- 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 256)"
- memswap_limit: "$(memory_value "$MEMORY_MB" 10 256)"
- 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 内存总预算: 65%"
|