如何获取服务器的CPU,内存进行限流
"github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/mem"
type MachineInfo struct {
CpuUsedRate float64
MemUsedRate float64
PassRate float64
}
var machineInfo *MachineInfo
var once sync.Once
func GetMachineInfo() *MachineInfo {
if machineInfo == nil {
once.Do(func() {
if machineInfo == nil {
machineInfo = new(MachineInfo)
machineInfo.MemUsedRate = 0
machineInfo.CpuUsedRate = 0
}
})
}
return machineInfo
}
// 1s更新一次
func (mi *MachineInfo) FetchCpuMemInfo() {
GetGoPool().AddFunc(func() {
for {
time.Sleep(1 * time.Second)
v, _ := mem.VirtualMemory()
//fmt.Println("mem: \n", v.UsedPercent)
// almost every return value is a struct
mi.MemUsedRate = v.UsedPercent
//fmt.Println("mi.MemRate: \n", mi.MemUsedRate)
}
})
GetGoPool().AddFunc(func() {
for {
time.Sleep(1 * time.Second)
// convert to JSON. String() is also implemented
v1, _ := cpu.Percent(time.Second, false)
//fmt.Println("cpu: \n", v1[0])
mi.CpuUsedRate = v1[0]
//fmt.Println("mi.CpuRate : \n", mi.CpuUsedRate)
}
})
GetGoPool().AddFunc(func() {
mi.CalcPassRate()
})
}
func (mi *MachineInfo) CalcPassRate() {
GetGoPool().AddFunc(func() {
for {
var rateMem float64 = 1
var rateCpu float64 = 1
time.Sleep(1 * time.Second)
if mi.MemUsedRate >= 85 {
rateMem = 0
} else if mi.MemUsedRate < 85 && mi.MemUsedRate >= 75 {
rateMem = 0.2
} else if mi.MemUsedRate < 75 && mi.MemUsedRate >= 70 {
rateMem = 0.4
} else if mi.MemUsedRate < 70 && mi.MemUsedRate >= 60 {
rateMem = 0.6
}
if mi.CpuUsedRate >= 85 {
rateMem = 0
} else if mi.CpuUsedRate < 85 && mi.CpuUsedRate >= 75 {
rateMem = 0.2
} else if mi.CpuUsedRate < 75 && mi.CpuUsedRate >= 70 {
rateMem = 0.4
} else if mi.CpuUsedRate < 70 && mi.CpuUsedRate >= 60 {
rateMem = 0.6
}
if rateMem > rateCpu {
mi.PassRate = rateCpu
} else {
mi.PassRate = rateMem
}
}
})
}
func (mi *MachineInfo) GetPassRate() float64 {
return mi.PassRate
}
- 最后根据通过率进行相应端口的限流策略
- 小知识点
- docker中可以获取宿主机的cpu,内存信息
- 如果不能开启特权模式(docker-compose文件中 privilege: true, 然后映射cpu文件到docker中)