Skip to content

Instantly share code, notes, and snippets.

@duzun
Created January 17, 2022 11:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save duzun/1246c850fb858ba2fdc1350e747ee87a to your computer and use it in GitHub Desktop.
Save duzun/1246c850fb858ba2fdc1350e747ee87a to your computer and use it in GitHub Desktop.
Show cgroup info for a given group (memory & cpu)
#!/bin/bash
#########################################
# Show cgroup info for a given group #
# #
# @author Dumitru Uzun (DUzun.Me) #
#########################################
# https://gist.github.com/duzun/1246c850fb858ba2fdc1350e747ee87a
bytes=
if [ "$1" = '-b' ]; then
bytes=1
shift
fi
g=$1
base=/sys/fs/cgroup
mem=$base/memory
cpu=$base/cpu
gmem=$mem/$g
gcpu=$cpu/$g
error() {
>&2 echo "$@"
}
echoc() {
local c=32m
if [ -n "$2" ]; then
[ "$2" -ne 0 ] && c=31m
[ "$2" -lt 0 ] && c=33m
fi
echo -e "\e[$c$1\e[m"
}
mem_unit() {
local unit=B
local sumf=${1:-$(cat)}
if [ -n "$bytes" ]; then
echo "$sumf"
return
fi
sum=$(printf "%.0f" "$sumf")
if [ "$sum" -gt 1024 ]; then
sumf=$(echo "scale=4; $sumf / 1024" | bc -l)
unit=KiB
if [ "$sum" -gt 1024 ]; then
sumf=$(echo "scale=4; $sumf / 1024" | bc -l)
sum=$(printf "%.0f" "$sumf")
unit=MiB
if [ "$sum" -gt 1024 ]; then
sumf=$(echo "scale=4; $sumf / 1024" | bc -l)
sum=$(printf "%.0f" "$sumf")
unit=GiB
if [ "$sum" -gt 1048576 ]; then
echo "∞"
return
fi
fi
fi
fi
printf "%'.2f%s" "$sumf" "$unit"
}
mem_read() {
local p=""
[ -n "$2" ] || p="memory."
cat "$gmem/$p$1"
}
# echo_usage <usage> <limit> [<soft_limit>]
echo_usage() {
local usage=$1
local limit=$2
local soft_limit=${3:-$limit}
echoc "$(mem_unit "$usage")" $(( (usage > soft_limit)*-1 + (usage > limit)*2 ))
}
memory_info() {
procs=$(mem_read cgroup.procs 1 | wc -l)
tasks=$(mem_read tasks 1 | wc -l)
usage_in_bytes=$(mem_read usage_in_bytes)
max_usage_in_bytes=$(mem_read max_usage_in_bytes)
limit_in_bytes=$(mem_read limit_in_bytes)
soft_limit_in_bytes=$(mem_read soft_limit_in_bytes)
failcnt=$(mem_read failcnt)
swappiness=$(mem_read swappiness)
memsw_usage_in_bytes=$(mem_read memsw.usage_in_bytes)
memsw_max_usage_in_bytes=$(mem_read memsw.max_usage_in_bytes)
memsw_limit_in_bytes=$(mem_read memsw.limit_in_bytes)
memsw_failcnt=$(mem_read memsw.failcnt)
sw_usage_in_bytes=$(( memsw_usage_in_bytes - usage_in_bytes ))
sw_max_usage_in_bytes=$(( memsw_max_usage_in_bytes - max_usage_in_bytes ))
sw_limit_in_bytes=$(( memsw_limit_in_bytes - limit_in_bytes ))
# stat=$(mem_read stat)
# numa_stat=$(mem_read numa_stat)
# use_hierarchy=$(mem_read use_hierarchy)
if [ "$tasks" -gt 0 ]; then
echo ""
echo "memory.procs: $procs ($tasks)"
fi
echo ""
echo -e "Mem ($(echoc "$failcnt" $failcnt)):"
echo " usage: $(echo_usage "$usage_in_bytes" $limit_in_bytes $soft_limit_in_bytes)"
echo " max : $(echo_usage "$max_usage_in_bytes" $limit_in_bytes $soft_limit_in_bytes)"
if [ "$soft_limit_in_bytes" -lt "$limit_in_bytes" ]; then
echo " limit: $(mem_unit $soft_limit_in_bytes) < $(mem_unit $limit_in_bytes)"
else
echo " limit: $(mem_unit $limit_in_bytes)"
fi
echo ""
echo "Swap $swappiness%:"
if [ "$sw_limit_in_bytes" -gt 1 ]; then
echo " usage: $(echo_usage "$sw_usage_in_bytes" $sw_limit_in_bytes)"
echo " max : $(echo_usage "$sw_max_usage_in_bytes" $sw_limit_in_bytes)"
echo " limit: $(mem_unit $sw_limit_in_bytes)"
else
echo " usage: $(mem_unit "$sw_usage_in_bytes")"
echo " max : $(mem_unit "$sw_max_usage_in_bytes")"
fi
echo ""
echo "Mem+Swap ($(echoc $memsw_failcnt $memsw_failcnt)):"
echo " usage: $(echo_usage "$memsw_usage_in_bytes" $memsw_limit_in_bytes)"
echo " max : $(echo_usage "$memsw_max_usage_in_bytes" $memsw_limit_in_bytes)"
echo " limit: $(mem_unit $memsw_limit_in_bytes)"
echo ""
}
cpu_info() {
local procs
local tasks
procs=$(cat $gcpu/cgroup.procs | wc -l)
tasks=$(cat $gcpu/tasks | wc -l)
echo ""
echo "CPU:"
if [ "$tasks" -gt 0 ]; then
echo "cpu.procs: $procs ($tasks)"
echo ""
fi
cat "$gcpu/cpu.stat"
echo ""
}
if [ "$#" -eq 0 ]; then
error "$(basename "$0") [-b] <cgroup>"
exit 1
fi
if [ -d "$gmem" ]; then
memory_info
else
error "memory/$g does not exist"
fi
if [ -d "$gcpu" ]; then
cpu_info
else
error "cpu/$g does not exist"
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment