Skip to content

Commit c4bc78c

Browse files
committed
Update.
1 parent 20267a5 commit c4bc78c

File tree

2 files changed

+36
-30
lines changed

2 files changed

+36
-30
lines changed

model/rule.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ func (u *Rule) Snapshot(cycleTransferStats *CycleTransferStats, server *Server,
7979
case "net_out_speed":
8080
src = float64(server.State.NetOutSpeed)
8181
case "net_all_speed":
82-
src = float64(server.State.NetOutSpeed + server.State.NetOutSpeed)
82+
src = float64(server.State.NetInSpeed + server.State.NetOutSpeed)
8383
case "transfer_in":
8484
src = float64(server.State.NetInTransfer)
8585
case "transfer_out":

service/rpc/server.go

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)