docker-limits.sh 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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.10 * 0.70);
  65. if (value < 256) value = 256;
  66. printf "%d", value;
  67. }')"
  68. mkdir -p "$(dirname "$OUTPUT_FILE")"
  69. cat > "$OUTPUT_FILE" <<EOF
  70. services:
  71. postgres:
  72. cpus: "$(cpu_value "$CPUS" 20)"
  73. mem_limit: "$(memory_value "$MEMORY_MB" 24 384)"
  74. memswap_limit: "$(memory_value "$MEMORY_MB" 24 384)"
  75. pids_limit: 512
  76. redis:
  77. cpus: "$(cpu_value "$CPUS" 5)"
  78. mem_limit: "$(memory_value "$MEMORY_MB" 5 128)"
  79. memswap_limit: "$(memory_value "$MEMORY_MB" 5 128)"
  80. pids_limit: 256
  81. rabbitmq:
  82. cpus: "$(cpu_value "$CPUS" 20)"
  83. mem_limit: "$(memory_value "$MEMORY_MB" 20 512)"
  84. memswap_limit: "$(memory_value "$MEMORY_MB" 20 512)"
  85. pids_limit: 512
  86. backend:
  87. cpus: "$(cpu_value "$CPUS" 45)"
  88. mem_limit: "$(memory_value "$MEMORY_MB" 41 768)"
  89. memswap_limit: "$(memory_value "$MEMORY_MB" 41 768)"
  90. pids_limit: 1024
  91. build:
  92. args:
  93. MAVEN_OPTS: "-Xmx${MAVEN_HEAP_MB}m -XX:ActiveProcessorCount=$BUILD_CPUS -Djava.awt.headless=true"
  94. environment:
  95. JAVA_TOOL_OPTIONS: "-XX:MaxRAMPercentage=50"
  96. frontend:
  97. cpus: "$(cpu_value "$CPUS" 10)"
  98. mem_limit: "$(memory_value "$MEMORY_MB" 10 256)"
  99. memswap_limit: "$(memory_value "$MEMORY_MB" 10 256)"
  100. pids_limit: 256
  101. build:
  102. args:
  103. NODE_OPTIONS: "--max-old-space-size=$NODE_OLD_SPACE_MB"
  104. EOF
  105. echo "已生成 Docker 资源限制: $OUTPUT_FILE"
  106. echo "宿主机 CPU: $CPUS, Docker CPU 总预算: 80%"
  107. echo "宿主机内存: ${MEMORY_MB}MB, Docker 内存总预算: 65%"