Naposledy aktivní 1 month ago

docker_check_cpu_mem.sh Raw
1#!/bin/bash
2set -euo pipefail
3
4MEM_WARN_MIB=1024
5MEM_CRIT_MIB=4096
6SWAP_WARN_MIB=2048
7SWAP_CRIT_MIB=8192
8CPU_WARN=1.0
9CPU_CRIT=2.0
10
11W_NAME_VAL=40
12
13RED="\033[0;31m"
14YELLOW="\033[0;33m"
15GREEN="\033[0;32m"
16BLUE="\033[0;34m"
17NC="\033[0m"
18
19to_mib() { echo $(( (${1:-0}) / 1024 / 1024 )); }
20
21human_bytes() {
22 local b="${1:-0}"
23 if [ -z "$b" ] || [ "$b" = "0" ]; then echo "unlimited"; return; fi
24 local mib=$((b / 1024 / 1024))
25 if [ "$mib" -ge 1024 ]; then echo "$((mib/1024))GiB"; else echo "${mib}MiB"; fi
26}
27
28pad_name() {
29 # fixed width name (NO COLORS)
30 printf "%-${W_NAME_VAL}.${W_NAME_VAL}s" "$1"
31}
32
33declare -A ST_CPU
34declare -A ST_MEM
35while IFS=$'\t' read -r name cpu mem; do
36 name="$(echo "$name" | xargs)"
37 ST_CPU["$name"]="$(echo "$cpu" | xargs)"
38 ST_MEM["$name"]="$(echo "$mem" | xargs)"
39done < <(docker stats --no-stream --format '{{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}' 2>/dev/null || true)
40
41tmp="$(mktemp)"
42trap 'rm -f "$tmp"' EXIT
43
44# status|name|sev|cpu_lim|mem_lim|swap_lim|cpu_used|mem_used|oom|cid
45for c in $(docker ps -aq); do
46 cid="$(docker inspect -f '{{.Id}}' "$c" | cut -c1-12)"
47 name="$(docker inspect -f '{{.Name}}' "$c" | sed 's#^/##')"
48 status="$(docker inspect -f '{{.State.Status}}' "$c")"
49 oom="$(docker inspect -f '{{.State.OOMKilled}}' "$c")"
50
51 mem_b="$(docker inspect -f '{{.HostConfig.Memory}}' "$c")"
52 swap_b="$(docker inspect -f '{{.HostConfig.MemorySwap}}' "$c")"
53 mem_mib="$(to_mib "$mem_b")"
54 swap_mib="$(to_mib "$swap_b")"
55
56 mem_lim="$(human_bytes "$mem_b")"
57 swap_lim="$(human_bytes "$swap_b")"
58
59 nanocpus="$(docker inspect -f '{{.HostConfig.NanoCpus}}' "$c")"
60 if [ -z "$nanocpus" ] || [ "$nanocpus" = "0" ]; then
61 cpu_lim="unlimited"
62 else
63 cpu_lim="$(awk -v n="$nanocpus" 'BEGIN { printf "%.2f", n/1000000000 }')"
64 fi
65
66 cpu_used="${ST_CPU[$name]:--}"
67 mem_used="${ST_MEM[$name]:--}"
68
69 # severity for name
70 sev="green"
71 if [ "$oom" = "true" ]; then sev="red"; fi
72 if [ "$mem_mib" -ge "$MEM_CRIT_MIB" ] || [ "$swap_mib" -ge "$SWAP_CRIT_MIB" ]; then sev="red"; fi
73
74 if [ "$sev" != "red" ]; then
75 if [ "$status" != "running" ]; then sev="yellow"; fi
76 if [ "$mem_mib" -ge "$MEM_WARN_MIB" ] || [ "$swap_mib" -ge "$SWAP_WARN_MIB" ]; then sev="yellow"; fi
77 if [ "$cpu_lim" != "unlimited" ]; then
78 awk -v c="$cpu_lim" -v warn="$CPU_WARN" 'BEGIN{ exit !(c+0 >= warn) }' && sev="yellow"
79 awk -v c="$cpu_lim" -v crit="$CPU_CRIT" 'BEGIN{ exit !(c+0 >= crit) }' && sev="red"
80 fi
81 fi
82
83 echo "${status}|${name}|${sev}|${cpu_lim}|${mem_lim}|${swap_lim}|${cpu_used}|${mem_used}|${oom}|${cid}" >> "$tmp"
84done
85
86print_section() {
87 local title="$1"
88 local filter="$2"
89
90 echo
91if [ "$title" = "RUNNING" ]; then
92 printf "${GREEN}===== %s =====${NC}\n" "$title"
93else
94 printf "${RED}===== %s =====${NC}\n" "$title"
95fi
96
97# echo "===== ${title} ====="
98
99 # Table without colors, aligned by column
100 {
101 echo "NAME|CPU_LIM|MEM_LIM|SWAP_LIM|CPU%|MEM_USED|STATUS|OOM|CONTAINER_ID"
102
103 awk -F'|' "$filter {print \$0}" "$tmp" | sort -t'|' -k2,2 | \
104 while IFS='|' read -r status name sev cpu_lim mem_lim swap_lim cpu_used mem_used oom cid; do
105 name_fixed="$(pad_name "$name")"
106 echo "${name_fixed}|${cpu_lim}|${mem_lim}|${swap_lim}|${cpu_used}|${mem_used}|${status}|${oom}|${cid}|${sev}"
107 done
108 } | column -t -s'|' | \
109 while IFS= read -r line; do
110 # colorize NAME only after alignment
111 # last column is severity, remove it from output
112 sev="$(echo "$line" | awk '{print $NF}')"
113 line_no_sev="${line% *}"
114
115 name_field="$(echo "$line_no_sev" | cut -d' ' -f1)"
116 rest="${line_no_sev#"$name_field"}"
117
118 if [ "$name_field" = "NAME" ]; then
119 echo "$line_no_sev"
120 continue
121 fi
122
123 case "$sev" in
124 red) printf "%b%s\n" "${RED}${name_field}${NC}" "$rest" ;;
125 yellow) printf "%b%s\n" "${YELLOW}${name_field}${NC}" "$rest" ;;
126 *) printf "%b%s\n" "${GREEN}${name_field}${NC}" "$rest" ;;
127 esac
128 done
129}
130
131
132print_section "RUNNING" '$1=="running"'
133print_section "NOT RUNNING" '$1!="running"'
134
docker_compose_config_meme_cpu.md Raw

Script check Docker Mem cpu

Bash file monitor --> docker_check_cpu_mem.sh (chmod +x)

✅ Audit Services Docker (CPU / RAM / Swap)

Objectif : limiter les pics RAM, éviter OOM, et garder des services réactifs. Format conseillé dans docker-compose (compose classique) :

  • cpus: "X.Y"
  • mem_limit: XXXm|Xg
  • memswap_limit: XXXm|Xg

✅ goaccess

  • Status : Up ✅
  • CPU : cpus: "0.5"
  • RAM : mem_limit: 768m
  • SWAP : memswap_limit: 1536m
  • Remarque : parsing logs => pics possibles.

⚠️ pulse

  • Status : Exited ❌
  • CPU : cpus: "0.5"
  • RAM : mem_limit: 1g (ou 2g si beaucoup de hosts)
  • SWAP : memswap_limit: 2g (ou 4g)
  • Remarque : sans /var/run/docker.sock => pas de monitoring Docker local.

⚠️ photoprism

  • Status : Exited ❌
  • CPU : cpus: "2.0"
  • RAM : mem_limit: 2g
  • SWAP : memswap_limit: 4g
  • Remarque : indexation/photo => très gourmand.

✅ big-bear-adguard-home-host

  • Status : Up ✅
  • CPU : cpus: "0.25"
  • RAM : mem_limit: 256m
  • SWAP : memswap_limit: 512m
  • Remarque : service léger.

✅ syncthing

  • Status : Up ✅ (healthy)
  • CPU : cpus: "1.0"
  • RAM : mem_limit: 512m
  • SWAP : memswap_limit: 1g
  • Remarque : pics possibles selon volume fichiers.

⚠️ n8n

  • Status : Created (pas lancé) ⚠️
  • CPU : cpus: "1.0"
  • RAM : mem_limit: 1g
  • SWAP : memswap_limit: 2g
  • Remarque : workflows + exec => pics.

✅ big-bear-filebrowser

  • Status : Up ✅ (healthy)
  • CPU : cpus: "0.25"
  • RAM : mem_limit: 256m
  • SWAP : memswap_limit: 512m
  • Remarque : léger.

⚠️ big-bear-stirling-pdf

  • Status : Exited ❌
  • CPU : cpus: "1.0"
  • RAM : mem_limit: 1g
  • SWAP : memswap_limit: 2g
  • Remarque : Java => peut monter.

✅ mariadb

  • Status : Up ✅
  • CPU : cpus: "1.0"
  • RAM : mem_limit: 1g
  • SWAP : memswap_limit: 2g
  • Remarque : le plus important à limiter proprement.

⚠️ big-bear-ghost

  • Status : Exited ❌
  • CPU : cpus: "0.5"
  • RAM : mem_limit: 512m
  • SWAP : memswap_limit: 1g
  • Remarque : OK, mais dépend trafic.

⚠️ big-bear-ghost-db (mysql:8)

  • Status : Exited ❌
  • CPU : cpus: "1.0"
  • RAM : mem_limit: 1g
  • SWAP : memswap_limit: 2g
  • Remarque : si tu utilises déjà mariadb ailleurs, évite 2 DB.

✅ big-bear-erugo

  • Status : Up ✅
  • CPU : cpus: "0.5"
  • RAM : mem_limit: 512m
  • SWAP : memswap_limit: 1g
  • Remarque : usage moyen.

✅ dozzle-agent

  • Status : Up ✅
  • CPU : cpus: "0.25"
  • RAM : mem_limit: 128m
  • SWAP : memswap_limit: 256m
  • Remarque : léger.

✅ dozzle

  • Status : Up ✅
  • CPU : cpus: "0.25"
  • RAM : mem_limit: 128m
  • SWAP : memswap_limit: 256m
  • Remarque : léger.

✅ portainer_agent

  • Status : Up ✅
  • CPU : cpus: "0.25"
  • RAM : mem_limit: 128m
  • SWAP : memswap_limit: 256m

✅ portainer

  • Status : Up ✅
  • CPU : cpus: "0.5"
  • RAM : mem_limit: 256m
  • SWAP : memswap_limit: 512m

✅ lagident

  • Status : Up ✅
  • CPU : cpus: "0.25"
  • RAM : mem_limit: 128m
  • SWAP : memswap_limit: 256m

✅ big-bear-glances

  • Status : Up ✅
  • CPU : cpus: "0.25"
  • RAM : mem_limit: 256m
  • SWAP : memswap_limit: 512m

✅ excalidraw

  • Status : Up ✅ (healthy)
  • CPU : cpus: "0.25"
  • RAM : mem_limit: 256m
  • SWAP : memswap_limit: 512m

⚠️ big-bear-composetoolbox

  • Status : Exited ❌
  • CPU : cpus: "0.25"
  • RAM : mem_limit: 256m
  • SWAP : memswap_limit: 512m

⚠️ big-bear-watchyourlan

  • Status : Exited ❌
  • CPU : cpus: "0.25"
  • RAM : mem_limit: 256m
  • SWAP : memswap_limit: 512m
  • Remarque : s’arrête souvent si pas de privilèges réseau.

✅ memos

  • Status : Up ✅
  • CPU : cpus: "0.25"
  • RAM : mem_limit: 256m
  • SWAP : memswap_limit: 512m

⚠️ ttydbridge

  • Status : Exited ❌
  • CPU : cpus: "0.25"
  • RAM : mem_limit: 128m
  • SWAP : memswap_limit: 256m

✅ openspeedtest

  • Status : Up ✅
  • CPU : cpus: "0.25"
  • RAM : mem_limit: 128m
  • SWAP : memswap_limit: 256m

⚠️ big-bear-brave

  • Status : Exited ❌
  • CPU : cpus: "1.0"
  • RAM : mem_limit: 1g
  • SWAP : memswap_limit: 2g
  • Remarque : container navigateur = lourd.

⚠️ tailscale

  • Status : Exited ❌
  • CPU : cpus: "0.25"
  • RAM : mem_limit: 128m
  • SWAP : memswap_limit: 256m
  • Remarque : souvent besoin --cap-add=NET_ADMIN ou mode host.