docker-limits.sh 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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" 'BEGIN {
  43. value = int(total * 0.50 * share / 100);
  44. if (value < 96) value = 96;
  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. NODE_OLD_SPACE_MB="$(awk -v total="$MEMORY_MB" 'BEGIN {
  59. value = int(total * 0.50 * 0.25);
  60. if (value < 512) value = 512;
  61. printf "%d", value;
  62. }')"
  63. mkdir -p "$(dirname "$OUTPUT_FILE")"
  64. cat > "$OUTPUT_FILE" <<EOF
  65. services:
  66. postgres:
  67. cpus: "$(cpu_value "$CPUS" 20)"
  68. mem_limit: "$(memory_value "$MEMORY_MB" 25)"
  69. memswap_limit: "$(memory_value "$MEMORY_MB" 25)"
  70. pids_limit: 512
  71. redis:
  72. cpus: "$(cpu_value "$CPUS" 5)"
  73. mem_limit: "$(memory_value "$MEMORY_MB" 5)"
  74. memswap_limit: "$(memory_value "$MEMORY_MB" 5)"
  75. pids_limit: 256
  76. rabbitmq:
  77. cpus: "$(cpu_value "$CPUS" 15)"
  78. mem_limit: "$(memory_value "$MEMORY_MB" 15)"
  79. memswap_limit: "$(memory_value "$MEMORY_MB" 15)"
  80. pids_limit: 512
  81. backend:
  82. cpus: "$(cpu_value "$CPUS" 50)"
  83. mem_limit: "$(memory_value "$MEMORY_MB" 45)"
  84. memswap_limit: "$(memory_value "$MEMORY_MB" 45)"
  85. pids_limit: 1024
  86. build:
  87. args:
  88. MAVEN_OPTS: "-XX:ActiveProcessorCount=$BUILD_CPUS -XX:MaxRAMPercentage=50 -Djava.awt.headless=true"
  89. environment:
  90. JAVA_TOOL_OPTIONS: "-XX:MaxRAMPercentage=50"
  91. frontend:
  92. cpus: "$(cpu_value "$CPUS" 10)"
  93. mem_limit: "$(memory_value "$MEMORY_MB" 10)"
  94. memswap_limit: "$(memory_value "$MEMORY_MB" 10)"
  95. pids_limit: 256
  96. build:
  97. args:
  98. NODE_OPTIONS: "--max-old-space-size=$NODE_OLD_SPACE_MB"
  99. EOF
  100. echo "已生成 Docker 资源限制: $OUTPUT_FILE"
  101. echo "宿主机 CPU: $CPUS, Docker CPU 总预算: 80%"
  102. echo "宿主机内存: ${MEMORY_MB}MB, Docker 内存总预算: 50%"