繁体   English   中英

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

[英]How to bind a process to a set of cpu in golang?

我使用 os/exec pkg 来运行进程。 我想检查它的 cpu 亲和力并修改它以将进程绑定到特定的 cpu 集。 我发现

func SchedSetaffinity(pid int, set *CPUSet) error

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

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

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

Go 有助于通过“SchedSetaffinity” 合并关联控制,可以检查将线程限制到特定内核。 因此,您可以得出使用“SchedSetaffinity(pid int, set *CPUSet)”的逻辑,该逻辑设置由 pid 指定的线程的 CPU 关联掩码。 如果 pid 为 0,则使用调用线程。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM