Golang代码增加cpu使用率

时间:2016-12-10 19:37:29

标签: go cpu

我需要一个golang代码片段来增加CPU使用率,这是为了测试运行pod的K8s集群中的自动扩展,我的服务是用Go编写的。我尝试使用循环计算Sqrt如下所示并打印结果,但它几乎不利用CPU。

num += math.Sqrt(num)
fmt.Println(num)

如果它不是无限循环会更好,因为我还需要停止加载和测试缩放。

3 个答案:

答案 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
    }
}