@@ -126,35 +126,41 @@ func (s *ServerHandler) ReportSystemState(c context.Context, r *pb.State) (*pb.R
126126 // 获取之前的流量值(原始值,不包含累计)
127127 prevNetIn := singleton .ServerList [clientID ].State .NetInTransfer - singleton .ServerList [clientID ].CumulativeNetInTransfer
128128 prevNetOut := singleton .ServerList [clientID ].State .NetOutTransfer - singleton .ServerList [clientID ].CumulativeNetOutTransfer
129-
130- // 计算流量差值的绝对值和百分比
131- netInDiff := float64 (prevNetIn - originalNetInTransfer )
132- netOutDiff := float64 (prevNetOut - originalNetOutTransfer )
133-
134- // 设置重启检测阈值:
135- // 1. 流量回退超过1GB且回退幅度超过50%
136- // 2. 或者两个方向的流量都大幅回退超过500MB
137- const restartThresholdBytes = 1024 * 1024 * 1024 // 1GB
138- const restartThresholdSmall = 500 * 1024 * 1024 // 500MB
139- const restartPercentThreshold = 0.5 // 50%
140-
141- if prevNetIn > 0 && prevNetOut > 0 { // 确保有历史数据
142- netInPercent := netInDiff / float64 (prevNetIn )
143- netOutPercent := netOutDiff / float64 (prevNetOut )
144-
145- // 重启条件:大幅流量回退
146- largeRollback := (netInDiff > restartThresholdBytes && netInPercent > restartPercentThreshold ) ||
147- (netOutDiff > restartThresholdBytes && netOutPercent > restartPercentThreshold )
148-
149- // 或者两个方向都有明显回退
150- bothRollback := netInDiff > restartThresholdSmall && netOutDiff > restartThresholdSmall
151-
152- if largeRollback || bothRollback {
153- isRestart = true
154- log .Printf ("检测到服务器 %s 可能重启: 入站回退=%.2fMB(%.1f%%), 出站回退=%.2fMB(%.1f%%)" ,
155- singleton .ServerList [clientID ].Name ,
156- netInDiff / (1024 * 1024 ), netInPercent * 100 ,
157- netOutDiff / (1024 * 1024 ), netOutPercent * 100 )
129+
130+ // 检查是否是真实的流量回退
131+ // 避免因数值溢出导致的错误检测
132+ if originalNetInTransfer < prevNetIn || originalNetOutTransfer < prevNetOut {
133+ // 设置重启检测阈值:
134+ // 1. 流量回退超过1GB且回退幅度超过50%
135+ // 2. 或者两个方向的流量都大幅回退超过500MB
136+ const restartThresholdBytes = 1024 * 1024 * 1024 // 1GB
137+ const restartThresholdSmall = 500 * 1024 * 1024 // 500MB
138+ const restartPercentThreshold = 0.5 // 50%
139+
140+ if prevNetIn > 0 && prevNetOut > 0 { // 确保有历史数据
141+ netInDiff := float64 (prevNetIn - originalNetInTransfer )
142+ netOutDiff := float64 (prevNetOut - originalNetOutTransfer )
143+
144+ // 确保差值合理,防止整数溢出导致的异常大数值
145+ if netInDiff >= 0 && netOutDiff >= 0 && netInDiff < 1e15 && netOutDiff < 1e15 {
146+ netInPercent := netInDiff / float64 (prevNetIn )
147+ netOutPercent := netOutDiff / float64 (prevNetOut )
148+
149+ // 重启条件:大幅流量回退
150+ largeRollback := (netInDiff > restartThresholdBytes && netInPercent > restartPercentThreshold ) ||
151+ (netOutDiff > restartThresholdBytes && netOutPercent > restartPercentThreshold )
152+
153+ // 或者两个方向都有明显回退
154+ bothRollback := netInDiff > restartThresholdSmall && netOutDiff > restartThresholdSmall
155+
156+ if largeRollback || bothRollback {
157+ isRestart = true
158+ log .Printf ("检测到服务器 %s 可能重启: 入站回退=%.2fMB(%.1f%%), 出站回退=%.2fMB(%.1f%%)" ,
159+ singleton .ServerList [clientID ].Name ,
160+ netInDiff / (1024 * 1024 ), netInPercent * 100 ,
161+ netOutDiff / (1024 * 1024 ), netOutPercent * 100 )
162+ }
163+ }
158164 }
159165 }
160166 }
0 commit comments