#!/usr/bin/env bash # phases: up | wait | inspect | idle | t1 | t5 | down | summarize set -euo pipefail unset HTTP_PROXY HTTPS_PROXY ALL_PROXY http_proxy https_proxy all_proxy NO_PROXY no_proxy ROOT="$(cd "$(dirname "$0")" && pwd)" cd "$ROOT" NAME="bench-s3b-searxng-cn" COMPOSE=(docker compose -p bench-s3b-searxng-cn -f "$ROOT/compose.yml") RAW="$ROOT/raw" SAMPLES="$ROOT/samples" mkdir -p "$RAW/bodies" "$SAMPLES" LOG="$RAW/commands.log" phase="${1:-}" log() { local ts ts=$(date -u +%Y-%m-%dT%H:%M:%SZ) echo "[$ts] $*" | tee -a "$LOG" } wait_ready() { local i code for i in $(seq 1 90); do set +e code=$(curl -sS -o /dev/null -w '%{http_code}' --connect-timeout 2 --max-time 3 -A 'onesvm-bench/s3b' "http://127.0.0.1:18880/" || true) set -e if [ "$code" = "200" ] || [ "$code" = "302" ] || [ "$code" = "403" ]; then # 403 can happen on / without format; try /healthz set +e hz=$(curl -sS -o /dev/null -w '%{http_code}' --max-time 3 -A 'onesvm-bench/s3b' "http://127.0.0.1:18880/healthz" || true) set -e log "ready http=/=>$code healthz=$hz after ${i}s" return 0 fi sleep 1 done log "ERROR: searxng not ready" docker logs "$NAME" 2>&1 | tail -80 | tee -a "$LOG" || true return 1 } inspect_image() { python3 - < "$RAW/t1.jsonl" STATS_DIR="$RAW" bash "$ROOT/lib/sample_stats.sh" searxng-cn-session 1 0 "$NAME" & spid=$! sleep 10 pick_url="" pick_title="" pick_cjk="" for i in 1 2 3 4 5; do log "T1 request $i" BODY_OUT="$RAW/bodies/t1-${i}.json" RAW_DIR="$RAW" bash "$ROOT/request.sh" t1 "$i" > "$RAW/t1-${i}.metrics.json" verdict=$(python3 "$ROOT/eval_t1.py" "$RAW/bodies/t1-${i}.json") python3 - "$RAW/t1-${i}.metrics.json" "$verdict" "$RAW/t1.jsonl" <<'PY' import json, sys m = json.loads(open(sys.argv[1], encoding="utf-8").read()) v = json.loads(sys.argv[2]) m.update(v) open(sys.argv[3], "a", encoding="utf-8").write(json.dumps(m, ensure_ascii=False) + "\n") print(json.dumps({"idx": m.get("idx"), "http": m.get("http_code"), "assert_ok": m.get("assert_ok"), "n": m.get("n_results"), "engines": m.get("engines"), "t_total": m.get("t_total")}, ensure_ascii=False)) PY if [ -z "$pick_url" ]; then pick_url=$(python3 -c "import json; d=json.load(open('$RAW/bodies/t1-${i}.json',encoding='utf-8')); import sys sys.path.insert(0,'$ROOT') from eval_t1 import eval_body v=eval_body(open('$RAW/bodies/t1-${i}.json',encoding='utf-8').read()); print(v.get('t2_url') or '')") pick_title=$(python3 -c "from eval_t1 import eval_body; v=eval_body(open('$RAW/bodies/t1-${i}.json',encoding='utf-8').read()); print(v.get('t2_title') or '')") pick_cjk=$(python3 -c "from eval_t1 import eval_body; v=eval_body(open('$RAW/bodies/t1-${i}.json',encoding='utf-8').read()); print(v.get('t2_title_cjk4') or '')") fi if [ "$i" -eq 1 ]; then sleep 10 kill "$spid" 2>/dev/null || true wait "$spid" 2>/dev/null || true fi done kill "$spid" 2>/dev/null || true wait "$spid" 2>/dev/null || true if [ -z "$pick_url" ]; then pick_url="https://www.gov.cn/zhengce/2021-03/13/content_5592681.htm" pick_title="国民经济和社会发展第十四个五年规划和2035年远景目标纲要" pick_cjk="国民经社" source="fallback" else source="t1" fi python3 - "$RAW/meta.json" "$pick_url" "$pick_title" "$pick_cjk" "$source" <<'PY' import json, sys, pathlib p = pathlib.Path(sys.argv[1]) meta = json.loads(p.read_text()) if p.exists() else {} meta["t2_pick"] = {"url": sys.argv[2], "title": sys.argv[3], "title_cjk4": sys.argv[4], "source": sys.argv[5]} p.write_text(json.dumps(meta, ensure_ascii=False, indent=2)) print(json.dumps(meta["t2_pick"], ensure_ascii=False, indent=2)) PY python3 - < "$RAW/t5.jsonl" STATS_DIR="$RAW" bash "$ROOT/lib/sample_stats.sh" searxng-cn-t5 1 0 "$NAME" & spid=$! t5start=$(date +%s) seq 1 60 | xargs -P 60 -I{} bash -c ' unset HTTP_PROXY HTTPS_PROXY ALL_PROXY http_proxy https_proxy all_proxy NO_PROXY no_proxy ROOT="'"$ROOT"'" RAW="'"$RAW"'" i="$1" BODY_OUT="$RAW/bodies/t5-${i}.json" RAW_DIR="$RAW" bash "$ROOT/request.sh" t5-once "$i" > "$RAW/t5-${i}.metrics.json" ' _ {} t5end=$(date +%s) log "T5 curls finished wall=$((t5end-t5start))s; cooling 15s" sleep 15 kill "$spid" 2>/dev/null || true wait "$spid" 2>/dev/null || true python3 - </dev/null || echo "unknown unknown") log "T5 oom/status=$oom" python3 - "$RAW/meta.json" "$oom" <<'PY' import json, sys, pathlib p = pathlib.Path(sys.argv[1]) meta = json.loads(p.read_text()) if p.exists() else {} parts = sys.argv[2].split() meta["oom"] = parts[0].lower() == "true" meta["container_status_after_t5"] = sys.argv[2] p.write_text(json.dumps(meta, ensure_ascii=False, indent=2)) PY ;; down) log "compose down" "${COMPOSE[@]}" down --remove-orphans || true docker rm -f "$NAME" 2>/dev/null || true ;; summarize) python3 "$ROOT/summarize.py" "$ROOT" ;; *) echo "usage: $0 up|wait|inspect|idle|t1|t5|down|summarize" >&2 exit 2 ;; esac