From d68d673cdcf45450eb17032288478c49650d6d08 Mon Sep 17 00:00:00 2001 From: stswangzhiping <59632378+stswangzhiping@users.noreply.github.com> Date: Thu, 19 Mar 2026 09:58:48 +0800 Subject: [PATCH] perf(heartbeat): 10s interval, collect metrics every 3rd beat (30s) Made-with: Cursor --- lib/client.js | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/lib/client.js b/lib/client.js index ca0d03c..f56c413 100644 --- a/lib/client.js +++ b/lib/client.js @@ -11,9 +11,11 @@ const { ProvisionManager } = require('./provisioning'); const { hasInternet } = require('./network'); const led = require('./led'); -const MAX_BACKOFF_MS = 60_000; -const PONG_TIMEOUT_MS = 15_000; -const PING_INTERVAL_MS = 30_000; +const MAX_BACKOFF_MS = 60_000; +const PONG_TIMEOUT_MS = 15_000; +const PING_INTERVAL_MS = 30_000; +const HEARTBEAT_INTERVAL_MS = 10_000; // 心跳间隔:10 秒,用于快速感知网络状态 +const METRICS_EVERY_N = 3; // 每 N 次心跳采集一次指标(= 30 秒) // systemd watchdog: 如果 WatchdogSec 存在,定期发 WATCHDOG=1 const SD_WATCHDOG_USEC = parseInt(process.env.WATCHDOG_USEC || '0', 10); @@ -279,9 +281,8 @@ class ClawClient { _startHeartbeat() { this._clearHeartbeat(); - const interval = (this._cfg.heartbeat_interval || 30) * 1000; this._sendHeartbeat(); - this._hbTimer = setInterval(() => this._sendHeartbeat(), interval); + this._hbTimer = setInterval(() => this._sendHeartbeat(), HEARTBEAT_INTERVAL_MS); } async _sendHeartbeat() { @@ -289,23 +290,25 @@ class ClawClient { try { this._hbCount++; - // 每 10 次心跳(约 5 分钟)刷新一次 dashboard 信息, - // 确保初次提取失败时能自动补偿,或在 token 变化后自动同步 - if (this._hbCount % 10 === 0) { + // 每 30 次心跳(约 5 分钟)刷新一次 dashboard 信息 + if (this._hbCount % 30 === 0) { const freshInfo = await getDashboardInfo().catch(() => null); if (freshInfo && Object.keys(freshInfo).length > 0) { this._dashInfo = freshInfo; } } - const metrics = await collect(); - this._send({ + // 每 METRICS_EVERY_N 次心跳(30 秒)采集一次指标,其余发轻量心跳 + const msg = { type: 'heartbeat', claw_id: this._cfg.claw_id, token: this._cfg.token, - metrics, - ...this._dashInfo, // 携带 dashboard_token / dashboard_port,供 VPS 幂等更新 - }); + ...this._dashInfo, + }; + if (this._hbCount % METRICS_EVERY_N === 0) { + msg.metrics = await collect(); + } + this._send(msg); } catch (e) { log.error('clawd', '心跳发送失败:', e.message); }