golang中如何绑定一个进程到一组cpu?

How to bind a process to a set of cpu in golang?

我用os/exec pkg 有一个进程运行。我想检查它 cpu affinity 并修改它以将进程绑定到特定的 cpu 集。我发现

func SchedSetaffinity(pid int, set *CPUSet) error

这个函数在golang.org/x/sys/unix package中。但是,它说它只是将线程绑定到特定的 cpu。我不知道它是否适用于流程。我想知道如何获得 CPUSet。这是我需要定义的值吗?

任务集: 要在特定 CPU 上启用进程 运行,您可以在 linux 中使用命令 'taskset' .因此,您可以得出基于“taskset -p [mask] [pid]”的逻辑,其中掩码表示特定进程应 运行 的核心,前提是整个程序 运行s 具有 GOMAXPROCS =1.

pthread_setaffinity_np : 您可以使用 cgo 并到达调用 pthread_setaffinity_np 的逻辑,因为 Go 在 cgo 模式下使用 pthreads。 (pthread_attr_setaffinity_np() 函数将attr 引用的线程属性对象的CPU affinity mask 属性设置为cpuset 中指定的值。)

Go helps in incorporation of affinity control 通过“SchedSetaffinity”可以检查是否将线程限制到特定内核。因此,您可以得出使用“SchedSetaffinity(pid int, set *CPUSet)”的逻辑,它设置由 pid 指定的线程的 CPU 关联掩码。如果 pid 为 0,则使用调用线程。

需要注意的是,GOMAXPROCS 变量限制了可以同时执行用户级 Go 代码的操作系统线程数。如果它 > 1 那么,您可以使用 Go 的 runtime.LockOSThread 将当前 goroutine 固定到 运行ning 上的当前线程。调用 goroutine 将始终在该线程中执行,并且没有其他 goroutine 将在其中执行,直到调用 goroutine 对 UnlockOSThread 的调用次数与对 LockOSThread 的调用次数一样多。

cgroups : 还有一个使用 cgroups 的选项,它有助于分层组织进程,并以受控和可配置的方式沿层次结构分配系统资源。在这里,有一个称为 cpuset 的子系统,它可以分配单个 CPUs(在多核系统上)和内存节点以在 cgroup 中进行处理。 cpuset 列出 CPUs 供此 cgroup 中的任务使用。 CPU 数字是以逗号分隔的数字或范围。例如:

#cat cpuset.cpus
0-4,6,8-10

一个进程被限制在运行它所属的cpuset中的CPUs上,并且只在该cpuset中的内存节点上分配内存。需要注意的是,所有进程在创建时都放在父进程所属的cgroup中,一个进程可以迁移到另一个cgroup。进程的迁移不会影响已经存在的后代进程。