#!/usr/bin/env bash # Full message-speed study. Must run ON NS1.GEORGELAMBERT.ORG (70.88.205.138). # Orchestration, nats bench (via pct into LXC 510), charts, HTML, and PDF all # happen on this host. The laptop is not in the measurement path. set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" export PATH="/usr/sbin:/usr/bin:/bin:/usr/local/bin:$PATH" HOST="$(hostname -f 2>/dev/null || hostname)" case "$HOST" in NS1.GEORGELAMBERT.ORG|NS1|ns1.georgelambert.org|ns1) ;; *) echo "refusing: study-on-ns1.sh must run on NS1.GEORGELAMBERT.ORG (70.88.205.138), got '$HOST'" >&2 exit 1 ;; esac # shellcheck disable=SC1091 . "$ROOT/client.env" CLIENT_VMID="${CLIENT_VMID:-510}" STAMP="$(date -u +%Y%m%dT%H%M%SZ)" OUT="${BENCH_OUT:-$ROOT/results/$STAMP}" mkdir -p "$OUT" dump_env() { local tag="$1" local f="$OUT/host-$tag.txt" { echo "execution_host=NS1.GEORGELAMBERT.ORG" echo "execution_ip=70.88.205.138" echo "hostname=$(hostname)" echo "utc=$(date -u +%Y-%m-%dT%H:%M:%SZ)" echo "whoami=$(whoami)" echo "pwd=$(pwd)" echo "uname=$(uname -a)" echo "nproc=$(nproc)" echo "loadavg=$(cat /proc/loadavg)" echo "client_vmid=$CLIENT_VMID" echo "nats_url=$NATS_URL" echo "js_extra_memory=${JS_EXTRA_MEMORY:-0}" echo "compare_dir=${COMPARE_DIR:-}" echo "--- nats 511 max_mem ---" sudo pct exec 511 -- grep max_mem /etc/nats/nats.conf || true echo "--- nats 511 jetstream mount ---" sudo pct exec 511 -- mount | grep jetstream || echo "jetstream on rootfs" echo "--- free ---" free -h echo "--- pct list ---" sudo pct list for v in 510 511 512 513; do echo "--- pct config $v ---" sudo pct config "$v" | grep -E '^(hostname|cores|memory|swap|rootfs|mp|net)' || true done } >"$f" python3 - "$OUT" "$tag" <<'PY' import json, sys, urllib.request from pathlib import Path out, tag = Path(sys.argv[1]), sys.argv[2] nodes = [] for vmid, name in (("511", "nats-a"), ("512", "nats-b"), ("513", "nats-c")): raw = "" try: import subprocess raw = subprocess.check_output( ["sudo", "pct", "exec", vmid, "--", "curl", "-fsS", "--max-time", "3", "http://127.0.0.1:8222/varz"], text=True, ) d = json.loads(raw) nodes.append({ "vmid": vmid, "name": name, "server_name": d.get("server_name"), "host": d.get("host"), "port": d.get("port"), "connections": d.get("connections"), "in_msgs": d.get("in_msgs"), "out_msgs": d.get("out_msgs"), "in_bytes": d.get("in_bytes"), "out_bytes": d.get("out_bytes"), "cpu": d.get("cpu"), "cores": d.get("cores"), "mem": d.get("mem"), "jetstream": bool(d.get("jetstream")), }) except Exception as e: nodes.append({"vmid": vmid, "name": name, "error": str(e)}) (out / f"varz-{tag}.json").write_text(json.dumps(nodes, indent=2) + "\n", encoding="utf-8") PY } echo "NS1 study $STAMP out=$OUT" dump_env before BENCH_OUT="$OUT" CLIENT_VMID="$CLIENT_VMID" bash "$ROOT/scripts/bench.sh" dump_env after python3 "$ROOT/scripts/build-ns1-study-report.py" "$OUT" "${COMPARE_DIR:-}" echo "NS1 study complete $OUT" ls -la "$OUT"/nats-cluster-bench-ns1.* "$OUT"/charts 2>/dev/null || ls -la "$OUT"