延迟瓶颈实测为本机 CPU 而非机房位置,跨站对比主指标改为 compute_ms

用户指出本机选新加坡是因为 Bitget 机房在新加坡。查证下来 ws.bitget.com 解析
到的是 CloudFront(dxotqhr62n6z4.cloudfront.net),落在新加坡 AS16509
(Amazon),即连的是 AWS 的 CDN 边缘而非 Bitget 自有机房。

腾讯云 ap-singapore(AS132203)到该边缘实测:ICMP 往返 2.1ms、TCP 握手
3.3ms、TLS 完成 9.0ms、首字节 87.8ms。首字节减 TLS 那约 79ms 是 CloudFront
回源开销,与我们的位置无关。

延迟构成(33 根样本):数据到达中位 506ms、信号计算中位 646ms、合计 1315ms。
随机房位置变化的只有那 2ms 往返,占总延迟 0.15%。而 646ms 的信号计算是每根
在 2000 根 1m 加 800 根 5m 上重建缠论结构,本机 2 核、2 个计算进程,三币同时
收盘时第三个还要排队——这才是有改善空间的一项。

因此:
- 新增 deploy/netprobe.sh,把网络那一段单独量出来并入运行元数据。用到达
  延迟去比两个机房等于用公斤秤称克,必须把可变的那段拿出来单独看。
- compare_sites.py 主指标改为 compute_ms,lag_data_ms 降为自检项(两站应当
  接近;若差很多,先怀疑时钟而非网络)。元数据表加 nproc/cpu_model/往返。
- README 改写:第二台机器该测 CPU 规格而非地理位置,WORKERS 按核数减一给,
  币数多于 worker 数时排队时间直接计入 compute_ms。

另修正站点标签:本机是腾讯云而非 Hetzner,sg-hetzner → sg-tencent,标错的
33 行数据已清掉重采。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
jack
2026-08-28 02:51:51 +08:00
co-authored by Cursor
parent 1661bbbac9
commit 95f2b614a2
4 changed files with 147 additions and 15 deletions
+69
View File
@@ -0,0 +1,69 @@
#!/usr/bin/env bash
# 量本机到 Bitget 端点的网络距离,输出 JSON。start.sh 会把它并进运行元数据。
#
# 为什么要单独量:K 线到达延迟(lag_data_ms)是「交易所推送节奏 + 回源 + 网络」
# 三者之和,中位 506ms。其中只有最后一段随机房位置变化,而实测它只有 2ms
# 往返——用到达延迟去比两个机房,等于用公斤秤称克。这个探测把可变的那一段
# 单独拿出来。
#
# 还有一件事值得知道:ws.bitget.com 解析出来是 CloudFrontAWS 的 CDN 边缘),
# 不是 Bitget 自己的机房。所以「离交易所近」实际是「离 CloudFront 边缘近」。
set -uo pipefail
WS_HOST="${WS_HOST:-ws.bitget.com}"
N="${N:-10}"
resolved="$(getent hosts "$WS_HOST" 2>/dev/null | head -1 || true)"
edge_ip="$(awk '{print $1}' <<<"$resolved")"
cname="$(awk '{print $2}' <<<"$resolved")"
icmp_min=null; icmp_avg=null
if out="$(ping -c "$N" -q -W 2 "$WS_HOST" 2>/dev/null)"; then
stats="$(grep -oE 'rtt min/avg/max/mdev = [0-9./]+' <<<"$out" | awk '{print $NF}')"
if [[ -n "$stats" ]]; then
icmp_min="$(cut -d/ -f1 <<<"$stats")"
icmp_avg="$(cut -d/ -f2 <<<"$stats")"
fi
fi
# TCP 握手是一个完整往返,比 ICMP 更能代表实际连接路径(有些网络对 ICMP 降级)
tcp_min=null; tls_min=null; ttfb_min=null
if command -v curl >/dev/null 2>&1; then
vals="$(for _ in $(seq "$N"); do
curl -s -o /dev/null --max-time 8 \
-w '%{time_connect} %{time_appconnect} %{time_starttransfer}\n' \
"https://$WS_HOST/v2/ws/public" 2>/dev/null
done)"
if [[ -n "$vals" ]]; then
tcp_min="$(awk '{print $1*1000}' <<<"$vals" | sort -n | head -1)"
tls_min="$(awk '{print $2*1000}' <<<"$vals" | sort -n | head -1)"
ttfb_min="$(awk '{print $3*1000}' <<<"$vals" | sort -n | head -1)"
fi
fi
org="unknown"
if [[ -n "$edge_ip" ]]; then
org="$(curl -s --max-time 6 "https://ipinfo.io/$edge_ip/json" 2>/dev/null \
| awk -F'"' '/"org"/{print $4}')"
[[ -n "$org" ]] || org="unknown"
fi
self_org="$(curl -s --max-time 6 https://ipinfo.io/json 2>/dev/null \
| awk -F'"' '/"org"/{print $4}')"
self_city="$(curl -s --max-time 6 https://ipinfo.io/json 2>/dev/null \
| awk -F'"' '/"city"/{print $4}')"
cat <<EOF
{
"ws_host": "$WS_HOST",
"edge_ip": "${edge_ip:-unknown}",
"edge_cname": "${cname:-unknown}",
"edge_org": "$org",
"self_org": "${self_org:-unknown}",
"self_city": "${self_city:-unknown}",
"icmp_min_ms": ${icmp_min:-null},
"icmp_avg_ms": ${icmp_avg:-null},
"tcp_connect_min_ms": ${tcp_min:-null},
"tls_done_min_ms": ${tls_min:-null},
"ttfb_min_ms": ${ttfb_min:-null}
}
EOF