go - 如何人为增加CPU使用率

标签 go cpu

我需要一个 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/

相关文章:

json - [去] : Parsing JSON

c++ - 有没有办法以编程方式查找当前使用的 GPU(C、C++)?

linux - pcpu 表示什么以及为什么乘以 1000?

go - 字符串到二维 slice

mongodb - Golang + MongoDB 嵌入类型(在另一个结构中嵌入一个结构)

Go MinGW 编译器提示 if-else 语句

mongodb - 使用 := gives unused error but using = don't in Go

node.js - 几个nodejs应用程序共享相同的cpu0还是它们在cpu之间分开?

cpu - 为什么 “while true”将使用100%的CPU资源?

java - 为什么 java 单线程在双核 (i5) 上的上限为 25%