Files
Chan/research/live/deploy/status.sh
T
jackandCursor 631d97e493 加跨地部署脚本与站点对比,数据全表加 site 列
目的是在第二台机器(AWS)上跑一套完全相同的采集,看不同地理位置的数据差异。
滑点里最大的一项是延迟漂移,而延迟含网络传输,所以机房选址是可优化参数。

数据侧两处必需改动:

- 全部输出加 site 列(三张 CSV 加 gzip 里的盘口与成交流)。没有这一列,两台
  机器的数据合起来就分不清来源。为免四处 writerow 漏加一处产生静默空值,
  改在 _SiteWriter 里统一注入。
- start.sh 在时钟未同步或偏移超 10ms 时**拒绝启动**。所有延迟数字都是
  「本地时钟 − 交易所 K 线收盘」,时钟偏 50ms 就全部同向偏 50ms,且不报错,
  只会让跨地对比得出一个干净且完全错误的结论。

deploy/ 下四个文件:setup.sh(docker + chrony + 拉镜像)、start.sh(校验时钟、
写运行元数据、起容器)、status.sh(健康速查)、README。运行元数据记 git commit、
镜像摘要、时钟偏移——两地数据对不上时,这三项任一不同都足以解释差异。

compare_sites.py 做配对对比:只取各站都有的 K 线(不取交集可能在比不同时段,
而延迟对市场活跃度敏感),并报配对差的符号占比而非两个中位数相减。已用注入
120ms 的合成数据验证能精确还原。另有一条自检:同一固定延迟点上两站漂移应当
相同——漂移是市场性质,若也差很多则先查时钟与时段对齐。

status.sh 里按列名取字段下标而非写死数字:加 site 列时字段整体右移过一次,
写死 $8 会静默变成读 lag_signal_ms 而非 lag_data_ms。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-28 02:39:47 +08:00

68 lines
2.3 KiB
Bash
Executable File

#!/usr/bin/env bash
# 采集器健康速查。跨地部署时两台都跑一遍,对着看。
set -uo pipefail
NAME="${NAME:-shadow}"
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)"
OUT="$REPO_ROOT/research/out"
say() { printf '\n\033[1m==> %s\033[0m\n' "$*"; }
say "容器"
docker ps -a --filter "name=^${NAME}$" \
--format 'table {{.Names}}\t{{.Status}}\t{{.RunningFor}}' || true
say "时钟"
if command -v chronyc >/dev/null 2>&1; then
chronyc tracking | grep -E 'System time|Last offset|Leap status'
fi
say "最近心跳"
docker logs "$NAME" 2>&1 | grep '\[心跳\]' | tail -3 || echo "还没到第一次心跳(每 5 分钟一次)"
say "告警与异常"
docker logs "$NAME" 2>&1 \
| grep -E '⚠|错误|失效|损坏|停滞|Traceback|退化' | tail -10 \
|| echo "无"
say "输出规模"
for f in shadow_latency.csv shadow_drift.csv shadow_signals.csv; do
p="$OUT/$f"
if [[ -s "$p" ]]; then
printf ' %-22s %8d 行\n' "$f" "$(( $(wc -l <"$p") - 1 ))"
elif [[ -f "$p" ]]; then
# 已建但表头还没冲刷:signals 只在有信号时才 flush,门控后每天仅 4~6 个
printf ' %-22s %8s\n' "$f" "0(待首条)"
else
printf ' %-22s %8s\n' "$f" "无"
fi
done
for f in shadow_books.jsonl.gz shadow_tape.jsonl.gz; do
p="$OUT/$f"
[[ -f "$p" ]] && printf ' %-22s %8s\n' "$f" "$(du -h "$p" | cut -f1)" \
|| printf ' %-22s %8s\n' "$f" "无"
done
say "各站点行数(确认 site 列生效)"
p="$OUT/shadow_latency.csv"
if [[ -f "$p" ]]; then
awk -F, 'NR>1{c[$1]++} END{for(s in c) printf " %-16s %8d 行\n", s, c[s]}' "$p"
else
echo " 尚无数据"
fi
say "到达延迟中位(本站,跨地对比的主指标)"
# 按列名取下标,不写死数字:加了 site 列之后字段整体右移过一次,
# 写死 $8 会静默变成读 lag_signal_ms
if [[ -s "$p" ]]; then
for sym in BTC ETH SOL; do
med=$(awk -F, -v s="$sym" '
NR==1 { for (i=1;i<=NF;i++) { if ($i=="sym") si=i; if ($i=="lag_data_ms") li=i } ; next }
$si==s && $li!="" { print $li }' "$p" | sort -n | awk '
{ v[NR]=$1 } END { if (NR) printf "%.0f %d", v[int((NR+1)/2)], NR }')
[[ -n "$med" ]] && printf ' %-5s 中位 %6sms (n=%s)\n' "$sym" ${med} \
|| printf ' %-5s 尚无数据\n' "$sym"
done
echo " 参考:本机(新加坡)补丁后实测 350~650ms,理论下限约 500ms"
fi