Enforcement (check-rules/hooks/shellcheck) per ADOPTING pattern; perf/ SoR from the #685 session (memcensus, pg role-caps SQL, applied sysctl, planned daemon.json); questions-v1 (API token + dockerd window asks). Meat + verification: https://projects.knownelement.com/issues/727#note-3913
31 lines
1.4 KiB
Bash
Executable File
31 lines
1.4 KiB
Bash
Executable File
#!/bin/sh
|
|
# perf/memcensus.sh — per-app memory limit vs usage census on tsys-cloudron [#685]
|
|
#
|
|
# Final v3 (v1/v2 had usage-parsing bugs; superseded). Reports per-container
|
|
# waste (limit minus usage) for apps with >=1GB limits — the basis for the
|
|
# memory-slider shrink table on Discourse t/316.
|
|
#
|
|
# Run (read-only, from a KNEL/PFVCluster checkout):
|
|
# VM_IP=my.knownelement.com VM_USER=root timeout 120 bash tests/remote.sh vm-file perf/memcensus.sh
|
|
# Needs: docker + awk on the host.
|
|
# memory census v3 [#685]
|
|
docker stats --no-stream --format "{{.Name}} {{.MemUsage}}" > /tmp/ms3.txt
|
|
docker ps --format "{{.Names}}" | while read -r n; do
|
|
lim=$(docker inspect "$n" --format '{{.HostConfig.Memory}}' 2>/dev/null)
|
|
fq=$(docker inspect "$n" --format '{{range .Config.Env}}{{println .}}{{end}}' 2>/dev/null | grep -m1 '^CLOUDRON_APP_DOMAIN=' | cut -d= -f2)
|
|
[ -z "$fq" ] && fq=$(docker inspect "$n" --format '{{.Config.Image}}' 2>/dev/null | sed 's|.*/||;s|:.*||')
|
|
echo "$n|$fq|$lim"
|
|
done > /tmp/ml3.txt
|
|
awk 'NR==FNR {
|
|
gsub(/,/,"");
|
|
if ($2 ~ /G/) u[$1] = $2 * 1024; else u[$1] = $2 + 0;
|
|
next
|
|
}
|
|
{
|
|
split($0, f, "|")
|
|
lim = f[3] / 1048576
|
|
use = u[f[1]] + 0
|
|
if (lim >= 1024)
|
|
printf "%7.0fMB | %-46s | %6.0fMB | %6.0fMB | %3.0f%%\n", lim - use, f[2], lim, use, (lim ? use / lim * 100 : 0)
|
|
}' /tmp/ms3.txt /tmp/ml3.txt | sort -t'|' -k1 -rn | head -30
|