如何获取服务器的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中)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 是的,我知道一些常用的分布式限流工具。以下是一些比较流行的限流工具: 1. Redis: 使用 Redis 可以简单地实现限流,特别是滑动窗口限流。 2. Guava RateLimiter: Guava 是 Google 的 Java 工具包,其中 RateLimiter 可以提供高效的令牌桶限流。 3. Bucket4J: Bucket4J 是一个 Java 库,可以提供功能强大的令牌桶和漏桶限流。 4. Netflix Zuul: Netflix Zuul 是一个微服务网关,内置了对限流的支持,可以很方便地在应用程序的边界处实现限流。 这些工具都有不同的优势和特性,请根据您的具体需求和环境选择适合您的工具。 ### 回答2: 有一些好用的分布式限流工具可以帮助我们实现系统的流量控制和限流,以下是其中几个常用的: 1. Alibaba Sentinel(阿里巴巴开源):一个功能强大的分布式系统流量防卫士,支持实时的流量控制、熔断降级、系统保护等功能,提供了丰富的配置和管理方式。 2. Spring Cloud Gateway:Spring Cloud生态系统中的一个网关工具,可以通过使用过滤器和限流机制来实现分布式限流,支持基于QPS、令牌桶等算法进行限流控制。 3. Nacos(阿里巴巴开源):一个用于动态服务发现、配置管理和服务治理的平台,其中包含了限流的功能,可以通过配置限流规则来实现请求的限制。 4. Redis+Lua脚本:通过在Redis中使用Lua脚本来实现限流功能。可以利用Redis的高性能和原子操作特性,结合令牌桶、漏桶等算法来实现流量控制。 5. ZooKeeper:一个分布式协调服务,可以用于实现分布式限流。可以利用ZooKeeper的有序节点特性和Watch机制来控制请求的并发量。 这些工具各有特点,具体选择取决于应用场景和需求。在实际使用时,需要根据系统的规模、性能需求和业务特点等因素,综合考虑选择合适的分布式限流工具。 ### 回答3: 当今的分布式系统越来越复杂和庞大,限流是保证系统稳定性和高可用性的重要策略之一。以下是我所知的几个好用的分布式限流工具: 1. Redis:Redis是一个高性能的内存数据存储系统,通过其提供的分布式缓存和限流功能可以实现简单而高效的限流逻辑。需要利用Redis的计数器或令牌桶等数据结构,将请求和访问进行计数,在达到限流阈值时进行拒绝或延迟处理。 2. Sentinel:Sentinel是阿里巴巴开源的一款分布式流量控制组件,它提供了流量控制、熔断降级、系统负载等功能。通过在每个服务节点上配置规则,可以统一限制请求的数量,避免系统被过多的请求压垮。 3. Nginx:Nginx是一款高性能的开源Web服务器,也可以用作分布式限流工具。通过配置Nginx反向代理服务器限流策略,可以限制请求的并发数、连接数等,而且能够根据不同的URL或IP设置不同的限流策略。 4. Alibaba Yet Another Distributed Rate Limiter (Sentinel):Sentinel是一个用于流量控制的分布式限流组件,由Alibaba开源。它具有动态规则的特性,可以基于各种参数和维度(如QPS、线程数、CPU负载等)对请求进行限流,以保护系统免受过载。 以上是一些我所知道的分布式限流工具,每个工具都有其独特的特点和适用场景。根据具体的需求和系统架构,选择适合的工具进行分布式限流是非常重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值