如何在 Go 中设置 CPU 亲和性

And*_*rei 20 cpu-usage go taskset

isolcpus只为内核任务分配总 CPU 核心的子集。这意味着我可以将提醒用于其他任务。我注意到当我从 go 运行测试/基准测试工具时,所有内核处理器都被使用(使用 htop)。但是,当我使用 时taskset -c 3-10 go test -bench .,只有一个 CPU 核心显示正在运行该命令。我预计工作负载会分配到核心 3-10。有可能实现这一目标吗?

更新:感谢 @JimB 的建议:我正在为内核核心保留的 cpu 核心上运行以下 golang 代码,taskset并且工作正常。但是,当在这些核心之外进行调度时,仅使用一个 cpu 核心,而不是 中指定的整个范围taskset

package main

import (
    "fmt"
    "golang.org/x/sys/unix"
    "testing"
    "time"
)


func TestSchedSetaffinity(t *testing.T) {

    var newMask unix.CPUSet
    newMask.Set(0)

    err := unix.SchedSetaffinity(0, &newMask)
    if err != nil {
            fmt.Printf("SchedSetaffinity: %v", err)
    }

    for i := 0; i < 50; i++ {
            fmt.Println("Hello world")
            time.Sleep(2 * time.Second)
    }
}
Run Code Online (Sandbox Code Playgroud)

And*_*rei 1

isolcpustaskset与和不能很好地配合使用go。要利用所有分配的 cpu 核心,您需要使用chrt.

例如:

taskset -c 3-10 chrt 1 ./my_go_workload_binary

假设该isolcpus组中有 3-10 个 cpu 核心。