我需要一个 Go 代码片段来增加 CPU 使用率,这是为了测试 K8s 集群中的自动缩放,该集群运行一个 pod,我的服务是用 Go 编写的。我尝试使用如下所示的循环计算 Sqrt 并打印结果,但它几乎不使用 CPU。
num += math.Sqrt(num)
fmt.Println(num)
如果它不是无限循环会更好,因为我还需要停止负载并测试缩减。
最佳答案
您真的不需要任何“CPU 密集型”计算;您只需要避免阻塞操作(例如等待网络连接上的数据或写入文件)并且您至少需要与可用的 CPU 内核一样多的 goroutines 来执行此操作(这可以使用 runtime.NumCPU()
查询)。
请注意,您甚至不必手动设置可同时执行的最大 CPU 数量 (runtime.GOMAXPROCS()
),因为这默认为自 Go 1.5 以来的可用核心数量。
使用 fmt.Println()
这是一个坏主意,因为它可能被定向到文件、网络连接等,因此,打印到它可能会阻塞(I/O 等待)。
使用“无限”循环,它除了检查是否到了中止时间外什么都不做。您可以使用单个 channel 执行此操作,在您想要中止时关闭它,因为在关闭的 channel 上接收可以立即继续,产生 channel 元素类型的零值,并且 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)
关于go - 如何人为增加CPU使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41079492/