我需要一个golang代码片段来增加CPU使用率,这是为了测试运行pod的K8s集群中的自动扩展,我的服务是用Go编写的。我尝试使用循环计算Sqrt如下所示并打印结果,但它几乎不利用CPU。
num += math.Sqrt(num)
fmt.Println(num)
如果它不是无限循环会更好,因为我还需要停止加载和测试缩放。
答案 0 :(得分:12)
你真的不需要任何“CPU密集型”计算;您只需要避免阻塞操作(例如在网络连接上等待数据或写入文件),并且您至少需要与可用的CPU核心一样多的goroutine(可以使用runtime.NumCPU()
查询)。
请注意,您甚至不必手动设置可以同时执行的最大CPU数(runtime.GOMAXPROCS()
),因为这默认为自Go 1.5以来的可用核心数。
使用fmt.Println()
是一个坏主意,因为它可能会被定向到文件,网络连接等,因此,打印到它可能会阻止(I / O等待)。
使用“无限”循环除了检查是否有时间中止之外什么也不做。您可以使用单个通道执行此操作,在要中止时将其关闭,因为在关闭通道上的接收可以立即进行,从而产生通道的元素类型的零值,并且goroutines可以使用{{1}进行检查}语句同时还有一个select
分支,否则default
语句将永远阻塞。
最简单的解决方案:
select
答案 1 :(得分:3)
这是一个使用所有核心将.
个字符写入/dev/null
的小片段,并在10秒后停止。
在我的情况下,这几乎占据了我的 Intel Core 2 Duo @ 2.20GHz 的100%,所以我不知道它在具有更高规格的地方执行时会如何表现,但我猜增加goroutines的数量。
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)
}
答案 2 :(得分:2)
noisypixy使用所有核心都有正确的想法,但在我的机器上它只能在所有处理器上达到约50%的负载。我相信这是因为Prints很慢,但不是CPU密集型。
package main
import (
"runtime"
"time"
)
func main() {
n := runtime.NumCPU()
runtime.GOMAXPROCS(n)
quit := make(chan bool)
for i := 0; i < n; i++ {
go func() {
for {
select {
case <-quit:
return
default:
}
}
}()
}
time.Sleep(10 * time.Second)
for i := 0; i < n; i++ {
quit <- true
}
}