onesvm-browser-server/bench/chrome-headless-shell/_lib.sh
chii 983259836d chore: init workspace with onesvm-dev-md + casa-commander
docs: 联网搜索服务架构方案全套(plan-final/design-arch/选型决策/整合导览/MCP文档/部署预设/联调手册)
bench: 5 方案 + 代理 + 站点矩阵本机实测工程(无密钥)
部署目标:primary mgr1 先行测试(待批准后执行)
2026-09-01 15:19:52 +08:00

122 lines
3.9 KiB
Bash

# shared helpers for S3c bench (no secrets)
set -euo pipefail
log() { printf '[%s] %s\n' "$(date '+%Y-%m-%dT%H:%M:%S%z')" "$*"; }
parse_mem_mib() {
python3 - "$1" <<'PY'
import re, sys
s = sys.argv[1].split("/")[0].strip()
m = re.match(r"([0-9.]+)\s*([A-Za-z]+)", s)
if not m:
print("0")
raise SystemExit
v, u = float(m.group(1)), m.group(2).lower()
mult = {"b":1,"kib":1024,"kb":1000,"mib":1024**2,"mb":1000**2,"gib":1024**3,"gb":1000**3}.get(u)
if not mult:
print("0"); raise SystemExit
print(f"{v * mult / (1024**2):.3f}")
PY
}
cgroup_mib() {
local c="$1" raw=""
raw="$(docker exec "$c" sh -c 'cat /sys/fs/cgroup/memory.current 2>/dev/null || cat /sys/fs/cgroup/memory/memory.usage_in_bytes 2>/dev/null' 2>/dev/null || true)"
if [[ -z "$raw" ]]; then
echo ""
return
fi
python3 -c "print(f'{int(\"$raw\")/(1024*1024):.3f}')"
}
sample_stats() {
local out="$1" interval="$2" duration="$3"
shift 3
mkdir -p "$(dirname "$out")"
echo -e "ts_iso\tname\tmem_usage\tcpu_pct\tmem_mib\tcgroup_mib" > "$out"
local end=$(( $(date +%s) + duration ))
while [ "$(date +%s)" -lt "$end" ]; do
local ts
ts=$(date -u +%Y-%m-%dT%H:%M:%SZ)
local name mem cpu
while IFS='|' read -r name mem cpu; do
[[ -z "${name:-}" ]] && continue
local mib cg
mib="$(parse_mem_mib "$mem")"
cg="$(cgroup_mib "$name")"
printf '%s\t%s\t%s\t%s\t%s\t%s\n' "$ts" "$name" "$mem" "$cpu" "$mib" "${cg:-}" >> "$out"
done < <(docker stats --no-stream --format '{{.Name}}|{{.MemUsage}}|{{.CPUPerc}}' "$@" 2>/dev/null || true)
sleep "$interval"
done
}
sample_until_file() {
local out="$1" interval="$2" sentinel="$3" extra_s="$4"
shift 4
mkdir -p "$(dirname "$out")"
echo -e "ts_iso\tname\tmem_usage\tcpu_pct\tmem_mib\tcgroup_mib" > "$out"
while [[ ! -f "$sentinel" ]]; do
local ts name mem cpu mib cg
ts=$(date -u +%Y-%m-%dT%H:%M:%SZ)
while IFS='|' read -r name mem cpu; do
[[ -z "${name:-}" ]] && continue
mib="$(parse_mem_mib "$mem")"
cg="$(cgroup_mib "$name")"
printf '%s\t%s\t%s\t%s\t%s\t%s\n' "$ts" "$name" "$mem" "$cpu" "$mib" "${cg:-}" >> "$out"
done < <(docker stats --no-stream --format '{{.Name}}|{{.MemUsage}}|{{.CPUPerc}}' "$@" 2>/dev/null || true)
sleep "$interval"
done
local end=$(( $(date +%s) + extra_s ))
while [ "$(date +%s)" -lt "$end" ]; do
local ts name mem cpu mib cg
ts=$(date -u +%Y-%m-%dT%H:%M:%SZ)
while IFS='|' read -r name mem cpu; do
[[ -z "${name:-}" ]] && continue
mib="$(parse_mem_mib "$mem")"
cg="$(cgroup_mib "$name")"
printf '%s\t%s\t%s\t%s\t%s\t%s\n' "$ts" "$name" "$mem" "$cpu" "$mib" "${cg:-}" >> "$out"
done < <(docker stats --no-stream --format '{{.Name}}|{{.MemUsage}}|{{.CPUPerc}}' "$@" 2>/dev/null || true)
sleep "$interval"
done
}
ensure_image() {
local img="$1" note="${2:-}"
local platform="linux/arm64"
local how="local"
if docker image inspect "$img" >/dev/null 2>&1; then
local arch
arch="$(docker image inspect --format '{{.Architecture}}' "$img")"
if [[ "$arch" == "arm64" || "$arch" == "arm64/v8" ]]; then
log "image present $img arch=$arch"
[[ -n "$note" ]] && echo "$how" > "$note"
return 0
fi
log "image $img arch=$arch not arm64; re-pull"
fi
log "docker pull --platform $platform $img"
if docker pull --platform "$platform" "$img"; then
how="hub"
[[ -n "$note" ]] && echo "$how" > "$note"
return 0
fi
local short="${img#docker.io/}"
local mirror="docker.m.daocloud.io/${short}"
log "primary pull failed; retry $mirror"
docker pull --platform "$platform" "$mirror"
docker tag "$mirror" "$img"
how="daocloud_mirror"
[[ -n "$note" ]] && echo "$how" > "$note"
}
wait_http() {
local url="$1" tries="${2:-40}"
local i
for i in $(seq 1 "$tries"); do
if curl -sf --max-time 2 "$url" >/dev/null; then
return 0
fi
sleep 1
done
return 1
}