#!/usr/bin/env bash # KNELPerf perfsnap — periodic /proc+cgroupfs snapshot collector. # Ported from ultix staged/reachableceo-perfsnap.sh (#826); generalizations: # - watched cgroups and interfaces are env/conf-driven lists (no baked-in # user ids or NIC names) # - log dir env-driven; same pipe-delimited format for awk analysis # # Env (or /etc/knelperf/perfsnap.conf): # KNELPERF_PERF_LOGDIR default /var/log/knelperf-perf # KNELPERF_SNAP_CGROUPS space-separated "label:/sys/fs/cgroup/path" list # KNELPERF_SNAP_IFACES space-separated interface names # Fields (snap.log): ts|l1|l5|l15|run|blocked|memavail_kb|psi_cpu|psi_mem| # psi_io|| # psi_* = avg60 "some" percentages. *_usec = cgroup cpu.stat usage_usec # (cumulative; analyze deltas). set -u CONF=/etc/knelperf/perfsnap.conf [ -r "$CONF" ] && . "$CONF" LOGDIR=${KNELPERF_PERF_LOGDIR:-/var/log/knelperf-perf} SNAP_CGROUPS=${KNELPERF_SNAP_CGROUPS:-} SNAP_IFACES=${KNELPERF_SNAP_IFACES:-} mkdir -p "$LOGDIR" ts=$(date +%s) read -r l1 l5 l15 _ < /proc/loadavg run=$(awk '/procs_running/{print $2}' /proc/stat) blocked=$(awk '/procs_blocked/{print $2}' /proc/stat) memavail=$(awk '/MemAvailable/{print $2}' /proc/meminfo) psi() { awk '$1=="some"{for(i=2;i<=NF;i++) if($i ~ /^avg60=/){sub("avg60=","",$i); print $i; exit}}' "/proc/pressure/$1" 2>/dev/null || echo 0; } line="$ts|$l1|$l5|$l15|$run|$blocked|$memavail|$(psi cpu)|$(psi memory)|$(psi io)" cgusec() { awk '/^usage_usec/{print $2}' "$1/cpu.stat" 2>/dev/null || echo 0; } for spec in $SNAP_CGROUPS; do line="$line|$(cgusec "${spec#*:}")" done nd() { awk -v i="$1" '$1==i":":{print $2" "$10}' /proc/net/dev 2>/dev/null || echo "0 0"; } for ifc in $SNAP_IFACES; do read -r rx tx <<< "$(nd "$ifc")" line="$line|$rx|$tx" done echo "$line" >> "$LOGDIR/snap.log" ps -eo pcpu,pid,comm --sort=-pcpu --no-headers | head -5 \ | awk -v t="$ts" '{print t"|"$1"|"$2"|"$3}' >> "$LOGDIR/procs.log" # retention: 14 days; rotate anything over 50MB find "$LOGDIR" -name '*.log' -mtime +14 -delete 2>/dev/null for f in "$LOGDIR"/*.log; do [ "$(wc -c <"$f" 2>/dev/null || echo 0)" -gt 52428800 ] && mv "$f" "$f.1" done exit 0