diff --git a/run_all_experiments.sh b/run_all_experiments.sh index 2deab2a..3dc5e30 100644 --- a/run_all_experiments.sh +++ b/run_all_experiments.sh @@ -39,6 +39,13 @@ sample_process_csv() { local start_uptime="$3" local max_seconds="$4" + local have_pidstat=0 + if command -v pidstat >/dev/null 2>&1; then + have_pidstat=1 + else + log "pidstat not found; install sysstat for accurate CPU sampling" + fi + while kill -0 "$pid" 2>/dev/null; do local now_uptime elapsed_s now_uptime=$(awk '{print $1}' /proc/uptime) @@ -65,7 +72,7 @@ sample_process_csv() { proc_count=$(count_processes || echo 0) thread_total=$(count_threads_total || echo 0) - # Use ps directly to avoid zero deltas for very short-lived processes. + # Use pidstat for CPU and ps for memory/thread metrics. local cpu rss vsz nlwp if command -v ps >/dev/null 2>&1; then read -r cpu rss vsz nlwp < <(ps -o %cpu=,rss=,vsz=,nlwp= -p "$pid" 2>/dev/null || echo "0 0 0 0") @@ -73,14 +80,17 @@ sample_process_csv() { rss=${rss:-0} vsz=${vsz:-0} nlwp=${nlwp:-0} - # Some busybox builds scale %CPU by 100. - cpu=$(awk -v c="$cpu" 'BEGIN{ if (c>1000) printf "%.2f", c/100; else printf "%.2f", c }') else - cpu=0.00 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 + cpu=0.00 + 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" \