Compare commits

...

2 Commits

Author SHA1 Message Date
andreastaliad 835d3dc4b4 maybe fixed cpu fork logging 2026-05-22 20:54:12 +03:00
andreastaliad a0410d4fbb maybe fixed cpu fork logging 2026-05-22 20:49:36 +03:00
+31 -25
View File
@@ -14,13 +14,19 @@ log() {
} }
count_processes() { count_processes() {
# Avoid find -regex portability issues (busybox) by using globbing on /proc. if command -v ps >/dev/null 2>&1; then
ls -d /proc/[0-9]* 2>/dev/null | wc -l ps -e -o pid= 2>/dev/null | wc -l
else
echo 0
fi
} }
count_threads_total() { count_threads_total() {
# Sum Threads: from all /proc/<pid>/status entries. if command -v ps >/dev/null 2>&1; then
awk '/^Threads:/ {sum+=$2} END {print sum+0}' /proc/[0-9]*/status 2>/dev/null || echo 0 ps -e -o nlwp= 2>/dev/null | awk '{sum+=$1} END {print sum+0}'
else
echo 0
fi
} }
get_mem_kb() { get_mem_kb() {
@@ -33,14 +39,11 @@ sample_process_csv() {
local start_uptime="$3" local start_uptime="$3"
local max_seconds="$4" local max_seconds="$4"
local clk_tck local have_pidstat=0
clk_tck=$(getconf CLK_TCK) if command -v pidstat >/dev/null 2>&1; then
have_pidstat=1
local prev_uptime prev_ticks else
prev_uptime=$(awk '{print $1}' /proc/uptime) log "pidstat not found; install sysstat for accurate CPU sampling"
prev_ticks=0
if [ -r "/proc/$pid/stat" ]; then
prev_ticks=$(awk '{print $14 + $15}' "/proc/$pid/stat")
fi fi
while kill -0 "$pid" 2>/dev/null; do while kill -0 "$pid" 2>/dev/null; do
@@ -69,22 +72,26 @@ sample_process_csv() {
proc_count=$(count_processes || echo 0) proc_count=$(count_processes || echo 0)
thread_total=$(count_threads_total || echo 0) thread_total=$(count_threads_total || echo 0)
local rss=0 vsz=0 stk=0 heap=0 nlwp=0 # Use pidstat for CPU and ps for memory/thread metrics.
if [ -r "/proc/$pid/status" ]; then local cpu rss vsz nlwp
rss=$(awk '/^VmRSS:/ {print $2}' "/proc/$pid/status")
vsz=$(awk '/^VmSize:/ {print $2}' "/proc/$pid/status")
stk=$(awk '/^VmStk:/ {print $2}' "/proc/$pid/status")
heap=$(awk '/^VmData:/ {print $2}' "/proc/$pid/status")
nlwp=$(awk '/^Threads:/ {print $2}' "/proc/$pid/status")
fi
# Use ps directly to avoid zero deltas for very short-lived processes.
local cpu
if command -v ps >/dev/null 2>&1; then if command -v ps >/dev/null 2>&1; then
cpu=$(ps -o %cpu= -p "$pid" 2>/dev/null | awk '{print $1}' || true) read -r cpu rss vsz nlwp < <(ps -o %cpu=,rss=,vsz=,nlwp= -p "$pid" 2>/dev/null || echo "0 0 0 0")
cpu=${cpu:-0}
rss=${rss:-0}
vsz=${vsz:-0}
nlwp=${nlwp:-0}
else
rss=0
vsz=0
nlwp=0
fi
if [ "$have_pidstat" -eq 1 ]; then
cpu=$(pidstat -p "$pid" 1 1 2>/dev/null | awk -v p="$pid" '$1 ~ /^[0-9]/ && $3==p {print $8; exit}')
cpu=${cpu:-0.00}
else else
cpu=0.00 cpu=0.00
fi fi
local stk=0 heap=0
printf "%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n" \ printf "%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n" \
"$(date -Iseconds)" "$elapsed_s" "$load1" "$load5" "$load15" \ "$(date -Iseconds)" "$elapsed_s" "$load1" "$load5" "$load15" \
@@ -92,7 +99,6 @@ sample_process_csv() {
"$pid" "$cpu" "${rss:-0}" "${vsz:-0}" "${stk:-0}" "${heap:-0}" "${nlwp:-0}" \ "$pid" "$cpu" "${rss:-0}" "${vsz:-0}" "${stk:-0}" "${heap:-0}" "${nlwp:-0}" \
>> "$csv" >> "$csv"
prev_uptime=$now_uptime
sleep 1 sleep 1
done done
} }