maybe hopefully fixed cpu fork logging

This commit is contained in:
2026-05-22 21:23:28 +03:00
parent e8c940a0d2
commit 83422abaf4
+26 -56
View File
@@ -30,7 +30,6 @@ sample_process_csv() {
local csv="$2" local csv="$2"
local start_uptime="$3" local start_uptime="$3"
local max_seconds="$4" local max_seconds="$4"
local proc_step="${5:-0}"
local have_pidstat=0 local have_pidstat=0
if command -v pidstat >/dev/null 2>&1; then if command -v pidstat >/dev/null 2>&1; then
@@ -47,9 +46,6 @@ sample_process_csv() {
prev_cpu_idle=$((c_idle + c_iowait)) prev_cpu_idle=$((c_idle + c_iowait))
fi fi
local first_sample=1
local next_proc_sample=0
while kill -0 "$pid" 2>/dev/null; do while kill -0 "$pid" 2>/dev/null; do
local now_uptime elapsed_s local now_uptime elapsed_s
now_uptime=$(awk '{print $1}' /proc/uptime) now_uptime=$(awk '{print $1}' /proc/uptime)
@@ -69,29 +65,14 @@ 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 should_sample=1 local load1 load5 load15
if [ "$proc_step" -gt 0 ]; then read -r load1 load5 load15 _ < /proc/loadavg
if [ "$first_sample" -eq 1 ]; then
next_proc_sample=$((((proc_count / proc_step) + 1) * proc_step))
first_sample=0
fi
if [ "$proc_count" -lt "$next_proc_sample" ]; then
should_sample=0
else
should_sample=1
next_proc_sample=$((next_proc_sample + proc_step))
fi
fi
if [ "$should_sample" -eq 1 ]; then local mem_total mem_avail mem_used
local load1 load5 load15 read -r mem_total mem_avail < <(get_mem_kb || echo "0 0")
read -r load1 load5 load15 _ < /proc/loadavg mem_used=$((mem_total - mem_avail))
local mem_total mem_avail mem_used # Use pidstat for CPU and /proc for memory/thread metrics.
read -r mem_total mem_avail < <(get_mem_kb || echo "0 0")
mem_used=$((mem_total - mem_avail))
# Use pidstat for CPU and ps for memory/thread metrics.
local cpu rss vsz nlwp local cpu rss vsz nlwp
rss=$(awk '/^VmRSS:/ {print $2}' "/proc/$pid/status" 2>/dev/null || echo 0) rss=$(awk '/^VmRSS:/ {print $2}' "/proc/$pid/status" 2>/dev/null || echo 0)
vsz=$(awk '/^VmSize:/ {print $2}' "/proc/$pid/status" 2>/dev/null || echo 0) vsz=$(awk '/^VmSize:/ {print $2}' "/proc/$pid/status" 2>/dev/null || echo 0)
@@ -104,30 +85,25 @@ sample_process_csv() {
fi fi
local stk=0 heap=0 local stk=0 heap=0
local sys_cpu_pct=0.00 local sys_cpu_pct=0.00
if [ -r /proc/stat ]; then if [ -r /proc/stat ]; then
read -r _ c_user c_nice c_system c_idle c_iowait c_irq c_softirq c_steal _ _ < /proc/stat read -r _ c_user c_nice c_system c_idle c_iowait c_irq c_softirq c_steal _ _ < /proc/stat
local cpu_total=$((c_user + c_nice + c_system + c_idle + c_iowait + c_irq + c_softirq + c_steal)) local cpu_total=$((c_user + c_nice + c_system + c_idle + c_iowait + c_irq + c_softirq + c_steal))
local cpu_idle=$((c_idle + c_iowait)) local cpu_idle=$((c_idle + c_iowait))
local dt_total=$((cpu_total - prev_cpu_total)) local dt_total=$((cpu_total - prev_cpu_total))
local dt_idle=$((cpu_idle - prev_cpu_idle)) local dt_idle=$((cpu_idle - prev_cpu_idle))
sys_cpu_pct=$(awk -v t="$dt_total" -v i="$dt_idle" 'BEGIN{ if (t<=0) printf "0.00"; else printf "%.2f", (100.0*(t-i))/t }') sys_cpu_pct=$(awk -v t="$dt_total" -v i="$dt_idle" 'BEGIN{ if (t<=0) printf "0.00"; else printf "%.2f", (100.0*(t-i))/t }')
prev_cpu_total=$cpu_total prev_cpu_total=$cpu_total
prev_cpu_idle=$cpu_idle prev_cpu_idle=$cpu_idle
fi
printf "%s,%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" \
"$mem_total" "$mem_avail" "$mem_used" "$proc_count" "$thread_total" \
"$pid" "$cpu" "$sys_cpu_pct" "${rss:-0}" "${vsz:-0}" "${stk:-0}" "${heap:-0}" "${nlwp:-0}" \
>> "$csv"
fi fi
if [ "$proc_step" -gt 0 ]; then printf "%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n" \
sleep 0.1 "$(date -Iseconds)" "$elapsed_s" "$load1" "$load5" "$load15" \
else "$mem_total" "$mem_avail" "$mem_used" "$proc_count" "$thread_total" \
sleep 1 "$pid" "$cpu" "$sys_cpu_pct" "${rss:-0}" "${vsz:-0}" "${stk:-0}" "${heap:-0}" "${nlwp:-0}" \
fi >> "$csv"
sleep 0.2
done done
} }
@@ -136,7 +112,6 @@ run_with_sampling() {
local cmd="$2" local cmd="$2"
local csv="$3" local csv="$3"
local max_seconds="$4" local max_seconds="$4"
local proc_step="${5:-0}"
log "Starting $name: $cmd" log "Starting $name: $cmd"
@@ -153,7 +128,7 @@ run_with_sampling() {
pid=$! pid=$!
fi fi
sample_process_csv "$pid" "$csv" "$start_uptime" "$max_seconds" "$proc_step" sample_process_csv "$pid" "$csv" "$start_uptime" "$max_seconds"
set +e set +e
wait "$pid" wait "$pid"
@@ -188,7 +163,6 @@ compile_thread_stress
# Defaults (override by env vars) # Defaults (override by env vars)
ALLOW_DANGEROUS=${ALLOW_DANGEROUS:-0} ALLOW_DANGEROUS=${ALLOW_DANGEROUS:-0}
FORK_BOMB_SECONDS=${FORK_BOMB_SECONDS:-5} FORK_BOMB_SECONDS=${FORK_BOMB_SECONDS:-5}
PROC_SAMPLE_STEP=${PROC_SAMPLE_STEP:-100}
CREATION_TIME_ITERS=${CREATION_TIME_ITERS:-"100 1000 10000"} CREATION_TIME_ITERS=${CREATION_TIME_ITERS:-"100 1000 10000"}
CREATION_TIME_SECONDS=${CREATION_TIME_SECONDS:-60} CREATION_TIME_SECONDS=${CREATION_TIME_SECONDS:-60}
@@ -199,16 +173,14 @@ run_with_sampling \
"creation_time" \ "creation_time" \
"cd '$ROOT_DIR/creation_time_experiment' && { for n in $CREATION_TIME_ITERS; do echo \"=== iterations=\$n ===\"; ./creation_time -n \"\$n\"; done; } >'$CREATION_TIME_STDOUT' 2>'$CREATION_TIME_STDERR'" \ "cd '$ROOT_DIR/creation_time_experiment' && { for n in $CREATION_TIME_ITERS; do echo \"=== iterations=\$n ===\"; ./creation_time -n \"\$n\"; done; } >'$CREATION_TIME_STDOUT' 2>'$CREATION_TIME_STDERR'" \
"$OUT_DIR/creation_time.csv" \ "$OUT_DIR/creation_time.csv" \
"$CREATION_TIME_SECONDS" \ "$CREATION_TIME_SECONDS"
0
if [ "$ALLOW_DANGEROUS" -eq 1 ]; then if [ "$ALLOW_DANGEROUS" -eq 1 ]; then
run_with_sampling \ run_with_sampling \
"fork_bomb" \ "fork_bomb" \
"cd '$ROOT_DIR/fork_bomb' && ./fork_bomb" \ "cd '$ROOT_DIR/fork_bomb' && ./fork_bomb" \
"$OUT_DIR/fork_bomb.csv" \ "$OUT_DIR/fork_bomb.csv" \
"$FORK_BOMB_SECONDS" \ "$FORK_BOMB_SECONDS"
"$PROC_SAMPLE_STEP"
else else
log "Skipping fork_bomb (set ALLOW_DANGEROUS=1 to run)" log "Skipping fork_bomb (set ALLOW_DANGEROUS=1 to run)"
echo "timestamp,elapsed_s,load1,load5,load15,mem_total_kb,mem_available_kb,mem_used_kb,proc_count,thread_count_total,pid,cpu_pct,sys_cpu_pct,rss_kb,vsz_kb,stack_kb,heap_kb,proc_threads" > "$OUT_DIR/fork_bomb.csv" echo "timestamp,elapsed_s,load1,load5,load15,mem_total_kb,mem_available_kb,mem_used_kb,proc_count,thread_count_total,pid,cpu_pct,sys_cpu_pct,rss_kb,vsz_kb,stack_kb,heap_kb,proc_threads" > "$OUT_DIR/fork_bomb.csv"
@@ -218,14 +190,12 @@ run_with_sampling \
"thread_recursive_scaling" \ "thread_recursive_scaling" \
"cd '$ROOT_DIR/thread_recursive_scaling' && ./run_thread_recursive.sh 6 6 6" \ "cd '$ROOT_DIR/thread_recursive_scaling' && ./run_thread_recursive.sh 6 6 6" \
"$OUT_DIR/thread_recursive_scaling.csv" \ "$OUT_DIR/thread_recursive_scaling.csv" \
0 \
0 0
run_with_sampling \ run_with_sampling \
"thread_stress" \ "thread_stress" \
"cd '$ROOT_DIR/thread_stress_test' && ./thread_stress" \ "cd '$ROOT_DIR/thread_stress_test' && ./thread_stress" \
"$OUT_DIR/thread_stress.csv" \ "$OUT_DIR/thread_stress.csv" \
0 \
0 0
log "All experiments finished" log "All experiments finished"