Files
vRp.CD2g_test/server/monitor.go
2023-05-24 11:04:34 +08:00

342 lines
9.3 KiB
Go

package server
import (
"github.com/kercylan98/minotaur/utils/timer"
"sync"
"time"
)
func newMonitor() *monitor {
m := &monitor{
ticker: timer.GetTicker(10),
}
m.ticker.Loop("tick", timer.Instantly, time.Second, timer.Forever, m.tick)
return m
}
type Monitor interface {
MessageTotal() int64
PacketMessageTotal() int64
ErrorMessageTotal() int64
CrossMessageTotal() int64
TickerMessageTotal() int64
MessageSecond() int64
PacketMessageSecond() int64
ErrorMessageSecond() int64
CrossMessageSecond() int64
TickerMessageSecond() int64
MessageCost() time.Duration
PacketMessageCost() time.Duration
ErrorMessageCost() time.Duration
CrossMessageCost() time.Duration
TickerMessageCost() time.Duration
MessageDoneAvg() time.Duration
PacketMessageDoneAvg() time.Duration
ErrorMessageDoneAvg() time.Duration
CrossMessageDoneAvg() time.Duration
TickerMessageDoneAvg() time.Duration
MessageQPS() int64
PacketMessageQPS() int64
ErrorMessageQPS() int64
CrossMessageQPS() int64
TickerMessageQPS() int64
MessageTopQPS() int64
PacketMessageTopQPS() int64
ErrorMessageTopQPS() int64
CrossMessageTopQPS() int64
TickerMessageTopQPS() int64
}
type monitor struct {
rwMutex sync.RWMutex
ticker *timer.Ticker
messageTotal int64 // 正在执行的消息总数
packetMessageTotal int64 // 正在执行的玩家消息总数
errorMessageTotal int64 // 正在执行的错误消息总数
crossMessageTotal int64 // 正在执行的跨服消息总数
tickerMessageTotal int64 // 正在执行的定时器消息总数
messageSecond int64 // 一秒内执行的消息并发量
packetMessageSecond int64 // 一秒内玩家消息并发量
errorMessageSecond int64 // 一秒内错误消息并发量
crossMessageSecond int64 // 一秒内跨服消息并发量
tickerMessageSecond int64 // 一秒内定时器消息并发量
messageCost time.Duration // 一秒内执行的消息总耗时
packetMessageCost time.Duration // 一秒内玩家消息总耗时
errorMessageCost time.Duration // 一秒内错误消息总耗时
crossMessageCost time.Duration // 一秒内跨服消息总耗时
tickerMessageCost time.Duration // 一秒内定时器消息总耗时
messageDoneAvg time.Duration // 一秒内执行的消息平均响应时间
packetMessageDoneAvg time.Duration // 一秒内玩家消息平均响应时间
errorMessageDoneAvg time.Duration // 一秒内错误消息平均响应时间
crossMessageDoneAvg time.Duration // 一秒内跨服消息平均响应时间
tickerMessageDoneAvg time.Duration // 一秒内定时器消息平均响应时间
messageQPS int64 // 一秒内执行的消息QPS
packetMessageQPS int64 // 一秒内玩家消息QPS
errorMessageQPS int64 // 一秒内错误消息QPS
crossMessageQPS int64 // 一秒内跨服消息QPS
tickerMessageQPS int64 // 一秒内定时器消息QPS
messageTopQPS int64 // 执行的消息最高QPS
packetMessageTopQPS int64 // 玩家消息最高QPS
errorMessageTopQPS int64 // 错误消息最高QPS
crossMessageTopQPS int64 // 跨服消息最高QPS
tickerMessageTopQPS int64 // 定时器消息最高QPS
}
func (slf *monitor) tick() {
slf.rwMutex.Lock()
// 秒平均响应时间
if slf.messageSecond == 0 {
slf.messageDoneAvg = 0
} else {
slf.messageDoneAvg = time.Duration(slf.messageCost.Nanoseconds() / slf.messageSecond)
}
if slf.packetMessageSecond == 0 {
slf.packetMessageDoneAvg = 0
} else {
slf.packetMessageDoneAvg = time.Duration(slf.packetMessageCost.Nanoseconds() / slf.packetMessageSecond)
}
if slf.errorMessageSecond == 0 {
slf.errorMessageDoneAvg = 0
} else {
slf.errorMessageDoneAvg = time.Duration(slf.errorMessageCost.Nanoseconds() / slf.errorMessageSecond)
}
if slf.crossMessageSecond == 0 {
slf.crossMessageDoneAvg = 0
} else {
slf.crossMessageDoneAvg = time.Duration(slf.crossMessageCost.Nanoseconds() / slf.crossMessageSecond)
}
if slf.tickerMessageSecond == 0 {
slf.tickerMessageDoneAvg = 0
} else {
slf.tickerMessageDoneAvg = time.Duration(slf.tickerMessageCost.Nanoseconds() / slf.tickerMessageSecond)
}
// 秒 QPS
if nanoseconds := slf.messageDoneAvg.Nanoseconds(); nanoseconds == 0 {
slf.messageQPS = 0
} else {
slf.messageQPS = slf.messageSecond / nanoseconds
}
if nanoseconds := slf.packetMessageDoneAvg.Nanoseconds(); nanoseconds == 0 {
slf.packetMessageQPS = 0
} else {
slf.packetMessageQPS = slf.packetMessageSecond / nanoseconds
}
if nanoseconds := slf.errorMessageDoneAvg.Nanoseconds(); nanoseconds == 0 {
slf.errorMessageQPS = 0
} else {
slf.errorMessageQPS = slf.errorMessageSecond / nanoseconds
}
if nanoseconds := slf.crossMessageDoneAvg.Nanoseconds(); nanoseconds == 0 {
slf.crossMessageQPS = 0
} else {
slf.crossMessageQPS = slf.crossMessageSecond / nanoseconds
}
if nanoseconds := slf.tickerMessageDoneAvg.Nanoseconds(); nanoseconds == 0 {
slf.tickerMessageQPS = 0
} else {
slf.tickerMessageQPS = slf.tickerMessageSecond / nanoseconds
}
// Top QPS
if slf.messageQPS > slf.messageTopQPS {
slf.messageTopQPS = slf.messageQPS
}
if slf.packetMessageQPS > slf.packetMessageTopQPS {
slf.packetMessageTopQPS = slf.packetMessageQPS
}
if slf.errorMessageQPS > slf.errorMessageTopQPS {
slf.errorMessageTopQPS = slf.errorMessageQPS
}
if slf.crossMessageQPS > slf.crossMessageTopQPS {
slf.crossMessageTopQPS = slf.crossMessageQPS
}
if slf.tickerMessageQPS > slf.tickerMessageTopQPS {
slf.tickerMessageTopQPS = slf.tickerMessageQPS
}
slf.messageSecond = 0
slf.packetMessageSecond = 0
slf.errorMessageSecond = 0
slf.crossMessageSecond = 0
slf.tickerMessageSecond = 0
slf.messageCost = 0
slf.packetMessageCost = 0
slf.errorMessageCost = 0
slf.crossMessageCost = 0
slf.tickerMessageCost = 0
slf.rwMutex.Unlock()
}
func (slf *monitor) messageRun(msg *Message) {
slf.rwMutex.Lock()
defer slf.rwMutex.Unlock()
switch msg.t {
case MessageTypePacket:
slf.packetMessageTotal++
slf.packetMessageSecond++
case MessageTypeError:
slf.errorMessageTotal++
slf.errorMessageSecond++
case MessageTypeCross:
slf.crossMessageTotal++
slf.crossMessageSecond++
case MessageTypeTicker:
slf.tickerMessageTotal++
slf.tickerMessageSecond++
default:
return
}
slf.messageTotal++
slf.messageSecond++
}
func (slf *monitor) messageDone(msg *Message, cost time.Duration) {
slf.rwMutex.Lock()
defer slf.rwMutex.Unlock()
switch msg.t {
case MessageTypePacket:
slf.packetMessageTotal--
slf.packetMessageCost += cost
case MessageTypeError:
slf.errorMessageTotal--
slf.errorMessageCost += cost
case MessageTypeCross:
slf.crossMessageTotal--
slf.crossMessageCost += cost
case MessageTypeTicker:
slf.tickerMessageTotal--
slf.tickerMessageCost += cost
default:
return
}
slf.messageTotal--
slf.messageCost += cost
}
func (slf *monitor) close() {
slf.ticker.Release()
}
func (slf *monitor) MessageTotal() int64 {
return slf.messageTotal
}
func (slf *monitor) PacketMessageTotal() int64 {
return slf.packetMessageTotal
}
func (slf *monitor) ErrorMessageTotal() int64 {
return slf.errorMessageTotal
}
func (slf *monitor) CrossMessageTotal() int64 {
return slf.crossMessageTotal
}
func (slf *monitor) TickerMessageTotal() int64 {
return slf.tickerMessageTotal
}
func (slf *monitor) MessageSecond() int64 {
return slf.messageSecond
}
func (slf *monitor) PacketMessageSecond() int64 {
return slf.packetMessageSecond
}
func (slf *monitor) ErrorMessageSecond() int64 {
return slf.errorMessageSecond
}
func (slf *monitor) CrossMessageSecond() int64 {
return slf.crossMessageSecond
}
func (slf *monitor) TickerMessageSecond() int64 {
return slf.tickerMessageSecond
}
func (slf *monitor) MessageCost() time.Duration {
return slf.messageCost
}
func (slf *monitor) PacketMessageCost() time.Duration {
return slf.packetMessageCost
}
func (slf *monitor) ErrorMessageCost() time.Duration {
return slf.errorMessageCost
}
func (slf *monitor) CrossMessageCost() time.Duration {
return slf.crossMessageCost
}
func (slf *monitor) TickerMessageCost() time.Duration {
return slf.tickerMessageCost
}
func (slf *monitor) MessageDoneAvg() time.Duration {
return slf.messageDoneAvg
}
func (slf *monitor) PacketMessageDoneAvg() time.Duration {
return slf.packetMessageDoneAvg
}
func (slf *monitor) ErrorMessageDoneAvg() time.Duration {
return slf.errorMessageDoneAvg
}
func (slf *monitor) CrossMessageDoneAvg() time.Duration {
return slf.crossMessageDoneAvg
}
func (slf *monitor) TickerMessageDoneAvg() time.Duration {
return slf.tickerMessageDoneAvg
}
func (slf *monitor) MessageQPS() int64 {
return slf.messageQPS
}
func (slf *monitor) PacketMessageQPS() int64 {
return slf.packetMessageQPS
}
func (slf *monitor) ErrorMessageQPS() int64 {
return slf.errorMessageQPS
}
func (slf *monitor) CrossMessageQPS() int64 {
return slf.crossMessageQPS
}
func (slf *monitor) TickerMessageQPS() int64 {
return slf.tickerMessageQPS
}
func (slf *monitor) MessageTopQPS() int64 {
return slf.messageTopQPS
}
func (slf *monitor) PacketMessageTopQPS() int64 {
return slf.packetMessageTopQPS
}
func (slf *monitor) ErrorMessageTopQPS() int64 {
return slf.errorMessageTopQPS
}
func (slf *monitor) CrossMessageTopQPS() int64 {
return slf.crossMessageTopQPS
}
func (slf *monitor) TickerMessageTopQPS() int64 {
return slf.tickerMessageTopQPS
}