From 9360ebefd87e178c76407125f2bc4d58a62b9589 Mon Sep 17 00:00:00 2001 From: "Logan.Li" Date: Mon, 14 Sep 2026 08:34:02 +0000 Subject: [PATCH] =?UTF-8?q?fix(agent):=20=E4=BF=AE=E5=A4=8D=20ticker=20?= =?UTF-8?q?=E8=A2=AB=E5=8F=8D=E5=A4=8D=20Reset=20=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E4=B8=8A=E6=8A=A5=E9=97=B4=E9=9A=94=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 配置轮询每 30s 都会收到相同的 report_interval 并触发 ticker.Reset, 而 Reset 会重新计时 —— 30s 的 ticker 永远等不到触发, 实际上报被无形拖长到 60~90s(实测 17 次/60s,应为 52 次)。 改为记录已生效的间隔,仅在值真正变化时才 Reset。 配置轮询间隔同样处理,否则每次轮询都 Reset 会让 ticker 永不触发。 验证:升级后上报 53 次/60s,Redis 采样时间戳精确 30s 间隔。 // Logan.Li --- agent/main.go | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/agent/main.go b/agent/main.go index 55b3c54..aa678aa 100644 --- a/agent/main.go +++ b/agent/main.go @@ -35,7 +35,7 @@ import ( ) var ( - version = "v2.2.0" + version = "v1.0.2" buildTime = "unknown" ) @@ -300,6 +300,12 @@ func main() { const minInterval = 5 * time.Second const fallbackConfigPollInterval = 30 * time.Second intervalUpdates := make(chan time.Duration, 1) + // appliedReportInterval 记录已生效的上报间隔(秒)。 + // 只在值真正变化时才下发重置信号:否则配置轮询每 30s 推一次相同值, + // ticker.Reset 会不断重新计时,导致 30s 的 ticker 永远等不到触发、 + // 上报被无形拖长到 60~90s。 // Logan.Li + appliedReportInterval := cfg.Interval + appliedConfigPollInterval := int(fallbackConfigPollInterval / time.Second) configTicker := time.NewTicker(fallbackConfigPollInterval) go func() { @@ -334,21 +340,24 @@ func main() { portCollector.SetPolicy(merged.PortPolicy) } - // 服务端下发的上报间隔 → 通知主循环热更新 ticker。 // Logan.Li - if merged.ReportInterval > 0 { + // 服务端下发的上报间隔 → 仅在值变化时通知主循环热更新 ticker。 // Logan.Li + if merged.ReportInterval > 0 && merged.ReportInterval != appliedReportInterval { next := time.Duration(merged.ReportInterval) * time.Second if next < minInterval { next = minInterval } + appliedReportInterval = merged.ReportInterval select { case intervalUpdates <- next: default: } } - // 服务端下发的配置轮询间隔 → 调整本循环节奏。 // Logan.Li - if merged.ConfigPollInterval > 0 { + // 服务端下发的配置轮询间隔 → 同样仅在值变化时重置, + // 否则每次轮询都 Reset 会让 ticker 永远不触发。 // Logan.Li + if merged.ConfigPollInterval > 0 && merged.ConfigPollInterval != appliedConfigPollInterval { next := time.Duration(merged.ConfigPollInterval) * time.Second - if next >= minInterval && next != fallbackConfigPollInterval { + if next >= minInterval { + appliedConfigPollInterval = merged.ConfigPollInterval configTicker.Reset(next) } }