如何获取服务器的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周期获取cpu,mem信息
// 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()
})
}
- 根据cpu,mem信息获取通过率
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中)
版权声明:本文为weixin_38805083原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。