docker-limits.sh 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #!/usr/bin/env sh
  2. set -eu
  3. OUTPUT_FILE="${1:-}"
  4. if [ -z "$OUTPUT_FILE" ]; then
  5. echo "用法: scripts/docker-limits.sh <output-compose-override.yml>" >&2
  6. exit 1
  7. fi
  8. detect_cpus() {
  9. if command -v nproc >/dev/null 2>&1; then
  10. nproc
  11. return
  12. fi
  13. if command -v getconf >/dev/null 2>&1; then
  14. getconf _NPROCESSORS_ONLN
  15. return
  16. fi
  17. if command -v sysctl >/dev/null 2>&1; then
  18. sysctl -n hw.ncpu
  19. return
  20. fi
  21. echo 2
  22. }
  23. detect_memory_mb() {
  24. if [ -r /proc/meminfo ]; then
  25. awk '/MemTotal/ { printf "%d\n", $2 / 1024 }' /proc/meminfo
  26. return
  27. fi
  28. if command -v sysctl >/dev/null 2>&1; then
  29. sysctl -n hw.memsize | awk '{ printf "%d\n", $1 / 1024 / 1024 }'
  30. return
  31. fi
  32. echo 4096
  33. }
  34. cpu_value() {
  35. awk -v total="$1" -v share="$2" 'BEGIN {
  36. value = total * 0.80 * share / 100;
  37. if (value < 0.10) value = 0.10;
  38. printf "%.2f", value;
  39. }'
  40. }
  41. memory_value() {
  42. awk -v total="$1" -v share="$2" -v minimum="${3:-96}" 'BEGIN {
  43. value = int(total * 0.65 * share / 100);
  44. if (value < minimum) value = minimum;
  45. printf "%dm", value;
  46. }'
  47. }
  48. integer_at_least_one() {
  49. awk -v value="$1" 'BEGIN {
  50. n = int(value);
  51. if (n < 1) n = 1;
  52. printf "%d", n;
  53. }'
  54. }
  55. CPUS="$(detect_cpus)"
  56. MEMORY_MB="$(detect_memory_mb)"
  57. BUILD_CPUS="$(integer_at_least_one "$(awk -v total="$CPUS" 'BEGIN { print total * 0.80 }')")"
  58. MAVEN_HEAP_MB="$(awk -v total="$MEMORY_MB" 'BEGIN {
  59. value = int(total * 0.65 * 0.41 * 0.70);
  60. if (value < 768) value = 768;
  61. printf "%d", value;
  62. }')"
  63. NODE_OLD_SPACE_MB="$(awk -v total="$MEMORY_MB" 'BEGIN {
  64. value = int(total * 0.65 * 0.25);
  65. if (value < 1024) value = 1024;
  66. if (value > 3072) value = 3072;
  67. printf "%d", value;
  68. }')"
  69. mkdir -p "$(dirname "$OUTPUT_FILE")"
  70. cat > "$OUTPUT_FILE" <<EOF
  71. services:
  72. postgres:
  73. cpus: "$(cpu_value "$CPUS" 20)"
  74. mem_limit: "$(memory_value "$MEMORY_MB" 24 384)"
  75. memswap_limit: "$(memory_value "$MEMORY_MB" 24 384)"
  76. pids_limit: 512
  77. redis:
  78. cpus: "$(cpu_value "$CPUS" 5)"
  79. mem_limit: "$(memory_value "$MEMORY_MB" 5 128)"
  80. memswap_limit: "$(memory_value "$MEMORY_MB" 5 128)"
  81. pids_limit: 256
  82. rabbitmq:
  83. cpus: "$(cpu_value "$CPUS" 20)"
  84. mem_limit: "$(memory_value "$MEMORY_MB" 20 512)"
  85. memswap_limit: "$(memory_value "$MEMORY_MB" 20 512)"
  86. pids_limit: 512
  87. backend:
  88. cpus: "$(cpu_value "$CPUS" 45)"
  89. mem_limit: "$(memory_value "$MEMORY_MB" 41 768)"
  90. memswap_limit: "$(memory_value "$MEMORY_MB" 41 768)"
  91. pids_limit: 1024
  92. build:
  93. args:
  94. MAVEN_OPTS: "-Xmx${MAVEN_HEAP_MB}m -XX:ActiveProcessorCount=$BUILD_CPUS -Djava.awt.headless=true"
  95. environment:
  96. JAVA_TOOL_OPTIONS: "-XX:MaxRAMPercentage=50"
  97. frontend:
  98. cpus: "$(cpu_value "$CPUS" 10)"
  99. mem_limit: "$(memory_value "$MEMORY_MB" 10 256)"
  100. memswap_limit: "$(memory_value "$MEMORY_MB" 10 256)"
  101. pids_limit: 256
  102. build:
  103. args:
  104. NODE_OPTIONS: "--max-old-space-size=$NODE_OLD_SPACE_MB"
  105. EOF
  106. echo "已生成 Docker 资源限制: $OUTPUT_FILE"
  107. echo "宿主机 CPU: $CPUS, Docker CPU 总预算: 80%"
  108. echo "宿主机内存: ${MEMORY_MB}MB, Docker 内存总预算: 65%"