延迟瓶颈实测为本机 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
+34 -7
View File
@@ -1,8 +1,17 @@
"""对比两个(或多个)采集站点的数据差异。
部署第二台机器的目的就是这个:延迟是「本地接收 − 交易所 K 线收盘」,直接
取决于机器到交易所的网络距离,换个地理位置这个数会变。而滑点里最大的一项
是延迟漂移,所以站点选址本身就是一个可优化的参数。
## 该比什么(2026-08-28 实测修正)
原以为该比地理位置,实测下来不是。腾讯云新加坡的延迟构成:
数据到达 506ms 其中网络仅 2ms 往返(ws.bitget.com 是 CloudFront 边缘)
信号计算 646ms 本机 2 核,三币同时收盘还要排队
合计 1315ms
换机房只能动那 2ms。**主指标是 compute_ms,不是 lag_data_ms。**
lag_data_ms 仍然要看,但作用是**自检**:两站应当几乎相同;若差很多,先怀疑
时钟没对齐——那比网络差异的可能性大得多。
## 判读前必须先看的两件事
@@ -68,10 +77,21 @@ def show_meta(out_dirs: list[Path]) -> None:
if not rows:
return
df = pd.DataFrame(rows)
keep = [c for c in ("site", "clock_offset_ms", "git_commit", "git_dirty",
"image_digest", "nproc", "mem_gb", "tz",
# net 是嵌套 dict,摊平出关心的几项
if "net" in df.columns:
for k in ("icmp_min_ms", "tcp_connect_min_ms", "ttfb_min_ms",
"self_org", "edge_org"):
df[k] = df["net"].apply(
lambda v, k=k: v.get(k) if isinstance(v, dict) else None)
keep = [c for c in ("site", "clock_offset_ms", "nproc", "cpu_model",
"icmp_min_ms", "ttfb_min_ms", "git_commit",
"git_dirty", "image_digest", "mem_gb", "tz",
"started_utc") if c in df.columns]
print(df[keep].to_string(index=False))
if "icmp_min_ms" in df and df["icmp_min_ms"].notna().any():
x = df["icmp_min_ms"].astype(float)
print(f"\n 到 Bitget 边缘的往返:{x.min():.1f}~{x.max():.1f}ms。"
f"站间极差 {x.max() - x.min():.1f}ms 就是换机房的全部空间")
if "clock_offset_ms" in df and df["clock_offset_ms"].notna().any():
o = df["clock_offset_ms"].astype(float)
spread = float(o.max() - o.min())
@@ -94,7 +114,10 @@ def compare_latency(df: pd.DataFrame, col: str = "lag_data_ms") -> None:
f"等第二台机器的数据到齐")
return
print(f"\n########## 二、到达延迟({col} ##########")
label = {"compute_ms": "信号计算耗时(主指标,取决于 CPU",
"lag_data_ms": "数据到达延迟(自检项,两站应当接近)",
"lag_signal_ms": "合计到可下单"}.get(col, col)
print(f"\n########## {label}{col} ##########")
print("\n 全量(各站各自的样本,时段可能不同)")
for s in sites:
x = df[df["site"] == s][col].dropna().astype(float)
@@ -176,7 +199,11 @@ def main() -> None:
show_meta([p for p in metas if p.is_dir()])
df = load(lat)
compare_latency(df)
# compute_ms 是主指标:它是延迟里唯一有大幅改善空间的一项(646ms vs
# 网络的 2ms)。lag_data_ms 放后面,作用是自检两站是否可比
compare_latency(df, "compute_ms")
compare_latency(df, "lag_data_ms")
compare_latency(df, "lag_signal_ms")
compare_drift(drf)