微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

func SchedSetaffinity(pid int,set *cpuSet) error

函数golang.org/x/sys/unix package 中。但是,它说它只是将线程绑定到特定的 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 helps in incorporation of affinity control 通过“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。进程的迁移不会影响已经存在的后代进程。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。