Golang代码增加cpu使用率

Sha*_*riq 3 cpu go

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

  • 你知道如何解决这种方法来达到特定的目标%.就像你想要模拟40%或85%的负载一样? (4认同)

noi*_*ixy 4

下面是一个小片段,它使用所有核心.来写入字符,并在 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)