Files
BT411/scratchpad/night14/gpverify.sh
T

75 lines
3.3 KiB
Bash

#!/usr/bin/env bash
# =========================================================================
# #149 -- 817 -> 857 stall regression (Oracle: 97 blocks >50ms, all in the
# mission-load window, maxDraw up to 518ms; zero such blocks on 817, same
# machine). My filed suspect was the #141 segment-cache sweep -- but that is
# a HYPOTHESIS, and #137 just taught us what plausible-but-unmeasured
# theories are worth. So: measure first.
#
# INSTRUMENTATION (this build):
# [segperf] calls=<GetSegmentToWorld entries> dirty=<mark-every-segment
# invalidation passes> ms=<time inside the accessor> -- per rstat window,
# BT_PERF_LOG-gated. The DIRTY count is the tell: if the beam path
# multiplies invalidations, dirty >> mechs-per-frame and ms tracks maxDraw.
#
# A/B: identical 2-node runs, beams firing continuously.
# run A: default (swept behaviour: beam muzzle via GetSegmentToWorld)
# run B: BT_BEAM_SEGFRESH=0 (pre-sweep plain compose at the BEAM site only)
# If A's stalls/dirty collapse in B, the beam-site sweep is the regression.
# If A == B and both are clean, the suspect is EXONERATED and the real 857
# load-stall cause is elsewhere (next: diff the load path).
# =========================================================================
set -x
. /c/git/bt411/scratchpad/night6/bench_common.sh
cd /c/git/bt411/content || exit 1
run_one () { # $1 = tag, $2 = extra env value for BT_BEAM_SEGFRESH
taskkill //F //IM btl4.exe > /dev/null 2>&1
sleep 2
rm -f sp_${1}_a.log sp_${1}_b.log sp_${1}_relay.log
bt_expert_egg MP.EGG SP.EGG
sed -i "s/^map=.*/map=grass/; s/^time=.*/time=day/; s/^vehicle=.*/vehicle=madcat/" SP.EGG
( export BT_GOTO=enemy BT_GOTO_STOP=120 BT_AUTOFIRE=1 BT_AF_PERIOD=3
export BT_MP_LOG=1
bt_launch sp_${1}_b.log SP.EGG 0x0C -net 1601 )
sleep 2
( export BT_GOTO=enemy BT_GOTO_STOP=120 BT_AUTOFIRE=1 BT_AF_PERIOD=3
export BT_MP_LOG=1 BT_GLASS_PANELS=1 BT_PLATFORM=glass
export BT_BEAM_SEGFRESH=${2}
bt_launch sp_${1}_a.log SP.EGG 0x03 -net 1501 )
sleep 5
python ../tools/btconsole.py SP.EGG 127.0.0.1:1501 127.0.0.1:1601 > sp_${1}_relay.log 2>&1 &
local RELAY=$!
sleep 180
kill $RELAY 2>/dev/null
sleep 3
bt_kill_ours; sleep 2; taskkill //F //IM btl4.exe > /dev/null 2>&1; sleep 3
}
run_one gp 1
echo "=================== #149 SEGPERF A/B ==================="
for t in fresh legacy; do
echo "--- $t ---"
python - <<PY
import re, io
v=[]; seg=[]
for ln in io.open(r"C:\git\bt411\content\sp_${t}_a.log", encoding="latin-1", errors="replace"):
m=re.search(r"\[rstat\] frames=\d+ avg=([\d.]+)ms maxDraw=([\d.]+)", ln)
if m: v.append((float(m.group(1)), float(m.group(2))))
m=re.search(r"\[segperf\] calls=(\d+) dirty=(\d+) ms=([\d.]+)", ln)
if m: seg.append((int(m.group(1)), int(m.group(2)), float(m.group(3))))
if v:
import statistics
avgs=[a for a,_ in v]; draws=[d for _,d in v]
stall=sum(1 for a,_ in v if a>50)
print(" rstat blocks=%d avg-med=%.2fms maxDraw-med=%.2f maxDraw-worst=%.1f blocks>50ms=%d"
% (len(v), statistics.median(avgs), statistics.median(draws), max(draws), stall))
if seg:
c=[x[0] for x in seg]; d=[x[1] for x in seg]; ms=[x[2] for x in seg]
print(" segperf windows=%d calls-med=%d dirty-med=%d ms-med=%.2f ms-worst=%.2f"
% (len(seg), sorted(c)[len(c)//2], sorted(d)[len(d)//2], sorted(ms)[len(ms)//2], max(ms)))
PY
done