空跑任务,满足CPU使用率合规要求

语言:golang
适用系统:linux
用途:空跑任务,满足CPU使用率合规要求
使用方法:go run cpulimit.go 0.35 // 百分之35%使用率

package main

import (
	"fmt"
	"io/ioutil"
	//	"math"
	"os"
	"runtime"
	"strconv"
	"strings"
	"time"
)

func main() {
	cpuNum := runtime.NumCPU()
	//	fmt.Println(os.Args)
	//limitPer := 0.35

	limitPer, _ := strconv.ParseFloat(os.Args[1], 64)
	fmt.Println("cpuNum: ", cpuNum)
	var chArr []chan bool = make([]chan bool, cpuNum*4)
	for i := 0; i < cpuNum*4; i++ {
		chArr[i] = make(chan bool)
	}
	tag := 0

	for {
		idle0, total0 := getCPUSample()
		time.Sleep(3 * time.Second)
		idle1, total1 := getCPUSample()

		idleTicks := float64(idle1 - idle0)
		// fmt.Println("idleTicks: ", idleTicks)
		totalTicks := float64(total1 - total0)
		// fmt.Println("totalTicks: ", totalTicks)
		cpuUsage := (totalTicks - idleTicks) / totalTicks
		fmt.Println("cpuUsage: ", cpuUsage)
		// busyNum := int(math.Floor(cpuUsage * float64(cpuNum)))
		// busyNum := int(math.Floor(cpuUsage * float64(cpuNum)))
		// pointerNum := int(math.Floor(float64(cpuNum) * limitPer))
		// fmt.Println("busynum: ", busyNum)
		// fmt.Println("pointerNum: ", pointerNum)

		//busyNum := 3
		if cpuUsage > limitPer {
			//for i := tag; i < tag; i-- {
			// fmt.Println("tag---: ", tag)
			chArr[tag-1] <- true
			tag -= 1
			//}
		} else if cpuUsage < limitPer {
			//for i := tag; i < pointerNum; i++ {
			// fmt.Println("tag++++: ", tag)
			go RunSomething(chArr[tag])
			tag += 1
			//}
		}
		time.Sleep(time.Duration(1) * time.Second)
		fmt.Println("now thread: ", tag)
		// fmt.Println(len(chArr))
	}
}

func getCPUSample() (idle, total uint64) {
	contents, err := ioutil.ReadFile("/proc/stat")
	if err != nil {
		return
	}
	lines := strings.Split(string(contents), "\n")
	for _, line := range lines {
		fields := strings.Fields(line)
		if fields[0] == "cpu" {
			numFields := len(fields)
			for i := 1; i < numFields; i++ {
				val, err := strconv.ParseUint(fields[i], 10, 64)
				if err != nil {
					fmt.Println("Error: ", i, fields[i], err)
				}
				total += val // tally up all the numbers to get total ticks
				if i == 4 {  // idle is the 5th field in the cpu line
					idle = val
				}
			}
			return
		}
	}
	return
}

func RunSomething(stopCh chan bool) {
	for {
		select {
		case ag := <-stopCh:
			fmt.Println(ag)
			goto end
		default:
			for j := 1; j < 100000; j++ {
				os.Hostname()
			}
		}
		//		fmt.Println(".........")
	}
end:
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值