如何获取服务器的CPU,内存进行限流

如何获取服务器的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版权协议,转载请附上原文出处链接和本声明。