判定要知道增量开没开,否则会推荐已经在做的事
上线 9 小时后实测踩到:清空 326ms 触发「币数 > 核数」那一支,于是继续输出 「唯一出路是走增量」——而增量已经生效。同一个分支在增量前后给同一个答案, 等于没有判定。 现在分开:增量未开就指向开增量;已开则指出单币 102ms 里 chan 构建只剩约 22ms,其余是 build_htf_zones / find_fast_bsp3 / attach_htf_context,要继续 压得改这三个或减币。顺带把「宽裕」阈值从 300 提到 400ms——清空 326ms 在 数据到达中位 347~558ms 面前不是瓶颈。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -76,6 +76,8 @@ from lib.shadow_budget import LAG_ALARM_MS, LAG_WINDOW, lag_healthy
|
||||
SITE = os.environ.get("SHADOW_SITE") or socket.gethostname()
|
||||
# 判「加 worker 有没有用」必须知道核数:CPU 密集的活,worker 超过核数不增吞吐
|
||||
CORES = os.cpu_count() or 1
|
||||
# 判定要知道增量开没开,否则增量已生效时还会继续推荐「走增量」
|
||||
INCR_ON = os.environ.get("SHADOW_INCR", "1") not in ("0", "", "false")
|
||||
# 少于这么多根就不送去算。缠论要先有分型再有笔再有中枢,几十根出不来中枢,
|
||||
# 送过去只会白占一个计算槽
|
||||
MIN_BARS = 200
|
||||
@@ -838,17 +840,22 @@ class Shadow:
|
||||
"""
|
||||
if not np.isfinite(clear):
|
||||
return "样本不足,暂不判定"
|
||||
if clear < 300:
|
||||
if clear < 400:
|
||||
return f"清空 {clear:.0f}ms,宽裕,无需优化"
|
||||
if self.workers < CORES and q > i:
|
||||
return (f"排队为主且还有 {CORES - self.workers} 个空闲核 → "
|
||||
f"--workers 加到 {CORES}")
|
||||
if len(SYMS) > CORES:
|
||||
per = clear / max(len(SYMS) / max(self.workers, 1), 1)
|
||||
if len(SYMS) <= CORES:
|
||||
return f"清空 {clear:.0f}ms 偏高,但币数未超核数,先查别的争抢"
|
||||
# 币数超核数:加 worker 不增吞吐,只能压单币耗时。但要看增量开没开,
|
||||
# 否则会在增量已生效时继续推荐「走增量」——上线后实测踩到过
|
||||
if not INCR_ON:
|
||||
return (f"币数 {len(SYMS)} > 核数 {CORES},加 worker 无用(CPU 密集)"
|
||||
f"。唯一出路是压单币耗时 {per:.0f}ms → 走增量 "
|
||||
f"init_stream/append_bar(HANDOFF §5.5,实测约 3.7x)")
|
||||
return f"清空 {clear:.0f}ms 偏高,但币数未超核数,先查是否有别的争抢"
|
||||
f"。压单币耗时 → 开 SHADOW_INCR=1 走增量(实测 3.56x)")
|
||||
return (f"币数 {len(SYMS)} > 核数 {CORES},且增量已生效。单币 {i:.0f}ms "
|
||||
f"里 chan 构建仅约 22ms,其余是 build_htf_zones / "
|
||||
f"find_fast_bsp3 / attach_htf_context —— 要继续压得改这三个,"
|
||||
f"或减币")
|
||||
|
||||
async def run(self) -> None:
|
||||
await self.start()
|
||||
|
||||
Reference in New Issue
Block a user