说明
Go 实现的小型web server,可以通过调用api来控制和消耗 CPU 占比。通常用于测试系统负载和性能。
代码在下面
编译和运行
在终端中编译代码:
go build
运行程序,然后调用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)
}
}