Go 实现的小型web server,可以通过调用api来控制和消耗 CPU 占比。通常用于测试系统负载和性能。

发布于:2024-06-06 ⋅ 阅读:(142) ⋅ 点赞:(0)

说明

Go 实现的小型web server,可以通过调用api来控制和消耗 CPU 占比。通常用于测试系统负载和性能。
代码在下面

编译和运行

  1. 在终端中编译代码:

    go build 
    
  2. 运行程序,然后调用api,例如:

    ./tools_cpu_burner_by_api
    
    再打开另一个shell,在shell中执行
    curl http://localhost:8080/cpu_burner?p=20
    

    p=50表示使web server占用服务器总cpu使用量的20%,可以根据需要改为其他数值,
    如果p=0,则表示不额外触发cpu使用量

上代码

package main

import (
	"fmt"
	"net/http"
	"runtime"
	"strconv"
	"time"
)

var numCPU int
var p int

func main() {

	numCPU = runtime.NumCPU()
	runtime.GOMAXPROCS(numCPU)
	fmt.Printf("Using %d CPUs\n", numCPU)

	go doCpuBurn()

	http.HandleFunc("/cpu_burner", cpuBurnerHandler)

	// 启动HTTP服务器
	fmt.Println("Server listening on :8080...")
	if err := http.ListenAndServe(":8080", nil); err != nil {
		panic(err)
	}
}

func cpuBurnerHandler(w http.ResponseWriter, r *http.Request) {
	// 解析查询参数中的load和duration
	percentageStr := r.URL.Query().Get("p")

	var err error

	if percentageStr != "" {
		p, err = strconv.Atoi(percentageStr)
		if err != nil {
			http.Error(w, "Invalid load parameter", http.StatusBadRequest)
			return
		}
	}
	if p < 0 || p > 100 {
		http.Error(w, "Invalid load parameter", http.StatusBadRequest)
		return
	}

	var rsp string
	rsp = fmt.Sprintf("Simulated CPU load for %d \n", p)

	fmt.Println(rsp)
	// 响应请求
	fmt.Fprintf(w, rsp)
}

func doCpuBurn() {

	for i := 0; i < numCPU; i++ {
		go burnCPU()
	}

}

func burnCPU() {

	for {
		busyTime := time.Duration(p) * time.Millisecond
		idleTime := time.Duration(100-p) * time.Millisecond

		start := time.Now()
		// Busy loop
		for time.Since(start) < busyTime {
		}
		// Idle time
		time.Sleep(idleTime)
	}
}


网站公告

今日签到

点亮在社区的每一天
去签到