我需要一个golang代码片段来增加CPU使用率,这是为了测试运行pod的K8s集群中的自动扩展,我的服务是用Go编写的.我尝试使用循环计算Sqrt如下所示并打印结果,但它几乎不利用CPU.
num += math.Sqrt(num)
fmt.Println(num)
Run Code Online (Sandbox Code Playgroud)
如果它不是无限循环会更好,因为我还需要停止加载和测试缩放.
icz*_*cza 14
你真的不需要任何"CPU密集型"计算; 您只需要避免阻塞操作(例如在网络连接上等待数据或写入文件),并且您至少需要与可用的CPU核心一样多的goroutine(这可以使用查询runtime.NumCPU()).
请注意,您甚至不必手动设置可以同时执行的最大CPU数(runtime.GOMAXPROCS()),因为这默认为自Go 1.5以来的可用核心数.
使用fmt.Println()是一个坏主意,因为它可能指向文件,网络连接等,因此,打印到它可能会阻塞(I/O等待).
使用"无限"循环除了检查是否有时间中止之外什么也不做.您可以使用单个通道执行此操作,在您想要中止时将其关闭,因为在关闭的通道上接收可以立即进行,从而产生通道的元素类型的零值,并且goroutines可以使用该select语句检查它,同时还具有一个default分支,否则该select声明将永远阻止.
最简单的解决方案
done := make(chan int)
for i := 0; i < runtime.NumCPU(); i++ {
go func() {
for {
select {
case <-done:
return
default:
}
}
}()
}
time.Sleep(time.Second * 10)
close(done)
Run Code Online (Sandbox Code Playgroud)
下面是一个小片段,它使用所有核心.来写入字符,并在 10 秒后停止。/dev/null
就我而言,这几乎 100% 使用了我的Intel Core 2 Duo @ 2.20GHz,所以我不知道在更高规格的地方执行时它会如何表现,但我想增加 goroutine 的数量就可以了。
package main
import (
"fmt"
"os"
"runtime"
"time"
)
func main() {
f, err := os.Open(os.DevNull)
if err != nil {
panic(err)
}
defer f.Close()
n := runtime.NumCPU()
runtime.GOMAXPROCS(n)
for i := 0; i < n; i++ {
go func() {
for {
fmt.Fprintf(f, ".")
}
}()
}
time.Sleep(10 * time.Second)
}
Run Code Online (Sandbox Code Playgroud)