| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- #!/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%"
|