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

sti*_*ian 12 runtime go

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

two*_*two 15

在现代Go中,我不会将goroutine锁定到线程以提高效率.Go 1.5 添加了goroutine调度关联,以最小化goroutines在OS线程之间切换的频率.并且必须权衡CPU之间剩余迁移的任何成本与用户模式调度程序的好处,避免上下文切换到内核模式.最后,当转换成本是一个真正的问题时,有时候更好的关注点是改变你的程序逻辑,因此它需要减少切换,比如通过批量工作而不是单个工作项.

但即使考虑到所有这些,有时你只需要锁定一个goroutine,就像C API需要它一样,我会假设下面就是这种情况.


如果整个程序运行GOMAXPROCS=1,那么通过从schedutils包调用taskset实用程序来设置CPU亲和性相对简单.

我以为你运气不好,GOMAXPROCS > 1因为那时goroutine在运行时在OS线程之间迁移.事实上,James Henstridge指出你可以 runtime.LockOSThread()用来保持你的goroutine不会迁移.但是,一旦你锁定了goroutine,我不知道任何Go stdlib函数来设置当前线程的CPU亲和力.您可能可以使用cgo和call pthread_setaffinity_np,因为显然Go在cgo模式下使用pthreads.由于我们讨论的是系统调用,因此操作系统会有所不同.

(如果你的整个程序是纯Go(没有C链接),它可以通过模块调用sched_setaffinitypid参数syscall.但这将是棘手的.)

  • 您可以使用`runtime.LockOSThread`将goroutine锁定到特定的OS线程.这可以与底层的OS CPU亲和程序一起使用来实现目标. (5认同)
  • 此处更新,[golang.org/x/sys/unix](https://godoc.org/golang.org/x/sys/unix) 包提供了 SchedSetaffinity 函数,可用于将指定线程固定到 CPU 的逻辑核心. (3认同)