123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- package tool
- import (
- "github.com/0xJacky/Nginx-UI/server/settings"
- "github.com/shirou/gopsutil/v3/cpu"
- "github.com/shirou/gopsutil/v3/disk"
- "github.com/shirou/gopsutil/v3/net"
- "runtime"
- "time"
- )
- type usage struct {
- Time time.Time `json:"x"`
- Usage float64 `json:"y"`
- }
- var CpuUserBuffer []usage
- var CpuTotalBuffer []usage
- var NetRecvBuffer []usage
- var NetSentBuffer []usage
- var DiskWriteBuffer []usage
- var DiskReadBuffer []usage
- var LastDiskWrites uint64
- var LastDiskReads uint64
- var LastNetRecv uint64
- var LastNetSent uint64
- func RecordServerAnalytic() {
- network, _ := net.IOCounters(false)
- diskIOCounters, _ := disk.IOCounters(settings.ServerSettings.DiskName)
- diskIO, ok := diskIOCounters[settings.ServerSettings.DiskName]
- if ok {
- LastDiskWrites = diskIO.WriteCount
- LastDiskReads = diskIO.ReadCount
- }
- if len(network) > 0 {
- LastNetRecv = network[0].BytesRecv
- LastNetSent = network[0].BytesSent
- }
- now := time.Now()
- // 初始化记录数组
- for i := 100; i > 0; i-- {
- u := usage{Time: now.Add(time.Duration(-i) * time.Second)}
- CpuUserBuffer = append(CpuUserBuffer, u)
- CpuTotalBuffer = append(CpuTotalBuffer, u)
- NetRecvBuffer = append(NetRecvBuffer, u)
- NetSentBuffer = append(NetSentBuffer, u)
- DiskWriteBuffer = append(DiskWriteBuffer, u)
- DiskReadBuffer = append(DiskReadBuffer, u)
- }
- for {
- cpuTimesBefore, _ := cpu.Times(false)
- time.Sleep(1000 * time.Millisecond)
- cpuTimesAfter, _ := cpu.Times(false)
- threadNum := runtime.GOMAXPROCS(0)
- cpuUserUsage := (cpuTimesAfter[0].User - cpuTimesBefore[0].User) / (float64(1000*threadNum) / 1000)
- cpuUserUsage *= 100
- cpuSystemUsage := (cpuTimesAfter[0].System - cpuTimesBefore[0].System) / (float64(1000*threadNum) / 1000)
- cpuSystemUsage *= 100
- now := time.Now()
- u := usage{
- Time: now,
- Usage: cpuUserUsage,
- }
- CpuUserBuffer = append(CpuUserBuffer, u)
- s := usage{
- Time: now,
- Usage: cpuUserUsage + cpuSystemUsage,
- }
- CpuTotalBuffer = append(CpuTotalBuffer, s)
- if len(CpuUserBuffer) > 100 {
- CpuUserBuffer = CpuUserBuffer[1:]
- }
- if len(CpuTotalBuffer) > 100 {
- CpuTotalBuffer = CpuTotalBuffer[1:]
- }
- network, _ = net.IOCounters(false)
- if len(network) == 0 {
- continue
- }
- NetRecvBuffer = append(NetRecvBuffer, usage{
- Time: now,
- Usage: float64(network[0].BytesRecv - LastNetRecv),
- })
- NetSentBuffer = append(NetRecvBuffer, usage{
- Time: now,
- Usage: float64(network[0].BytesSent - LastNetSent),
- })
- LastNetRecv = network[0].BytesRecv
- LastNetSent = network[0].BytesSent
- if len(NetRecvBuffer) > 100 {
- NetRecvBuffer = NetRecvBuffer[1:]
- }
- if len(NetSentBuffer) > 100 {
- NetSentBuffer = NetSentBuffer[1:]
- }
- diskIOCounters, _ = disk.IOCounters(settings.ServerSettings.DiskName)
- diskIO, ok = diskIOCounters[settings.ServerSettings.DiskName]
- if ok {
- DiskReadBuffer = append(DiskReadBuffer, usage{
- Time: now,
- Usage: float64(diskIO.ReadCount - LastDiskReads),
- })
- DiskWriteBuffer = append(DiskWriteBuffer, usage{
- Time: now,
- Usage: float64(diskIO.WriteCount - LastDiskWrites),
- })
- if len(DiskReadBuffer) > 100 {
- DiskReadBuffer = DiskReadBuffer[1:]
- }
- if len(DiskWriteBuffer) > 100 {
- DiskWriteBuffer = DiskWriteBuffer[1:]
- }
- LastDiskWrites = diskIO.WriteCount
- LastDiskReads = diskIO.ReadCount
- }
- }
- }
|