go - 是否可以强制 go 例程在特定 CPU 上运行?

标签 go runtime

我正在阅读有关 go 包“运行时”的信息,并看到我可以在其他 (func GOMAXPROCS(n int)) 中设置可用于运行我的程序的 CPU 单元的数量。我可以强制 goroutine 在我选择的特定 CPU 上运行吗?

最佳答案

在现代 Go 中,为了提高效率,我不会将 goroutine 锁定到线程。去 1.5 added goroutine scheduling affinity, to minimize how often goroutines switch between OS threads . CPU 之间剩余迁移的任何成本都必须与用户模式调度程序避免上下文切换到内核模式的好处进行权衡。最后,当切换成本是一个真正的问题时,有时更好的重点是改变你的程序逻辑,这样它就需要更少的切换,比如通过通信批量工作而不是单个工作项。

但即使考虑到所有这些,有时您只需要锁定一个 goroutine,例如当 C API 需要它时,我会假设下面是这种情况。


如果整个程序以 GOMAXPROCS=1 运行,那么 it's relatively simple to set a CPU affinity by calling out to the taskset utility from the schedutils package .

我原以为如果 GOMAXPROCS > 1 你不走运,因为那时 goroutines are migrated between OS threads at runtime .事实上,James Henstridge 指出你可以使用 runtime.LockOSThread()防止你的 goroutine 迁移。但是,一旦您将 goroutine 锁定到它,我不知道有任何 Go stdlib 函数来设置当前线程的 CPU 亲和性。您也许可以使用 cgo 并调用 pthread_setaffinity_np , 因为显然 Go uses pthreads in cgo mode .由于我们讨论的是系统调用,因此细节会因操作系统而异。

(如果你的整个程序是纯 Go(没有 C 链接),它可以通过 syscall 模块使用零 pid 参数调用 sched_setaffinity。但这会很棘手。)

关于go - 是否可以强制 go 例程在特定 CPU 上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19758961/

相关文章:

xml - 在 Go 中解析 XML

mongodb - 如何处理重复的唯一索引错误?

go - 如何使用Golang组织异步消息发布到RabbitMQ?

json - 在 golang 中像请求一样发送 curl

java - 执行 Runtime.getRuntime().exec(),参数之间留有空格

c# - 当新版本已签名但以前未签名时,.NET 程序集绑定(bind)重定向

eclipse - 如何在 GoClipse 中交叉引用?

C#如何在运行时获取管理员权限

c# - 在运行时在 Unity 中解析具有超过 65k 个顶点的网格

c# - 在运行时加载 NuGet 依赖项