一尘不染

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

go

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


阅读 443

收藏
2020-07-02

共1个答案

一尘不染

在现代Go中,我不会为了提高效率而将goroutine锁定在线程上。Go 1.5
添加了goroutine调度亲和力,以最小化goroutine在OS线程之间切换的频率。而且,必须权衡CPU之间剩余迁移的任何成本和用户模式调度程序的好处,避免上下文切换到内核模式。最后,当转换成本是一个实际问题时,有时更好的重点是更改程序逻辑,因此它需要进行的转换更少,例如通过传达批量工作而不是单个工作项。

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


如果整个程序都运行GOMAXPROCS=1,则通过从schedutils包中调用taskset实用程序来设置CPU亲和力相对简单

我本来以为您不走运,GOMAXPROCS > 1因为那样的话,goroutines会在运行时在OS线程之间迁移。实际上,詹姆斯·亨斯特里奇(James
Henstridge)指出,您可以使用它
runtime.LockOSThread()来防止goroutine迁移。我不知道一旦将goroutine锁定到它后,就不会有任何Go
stdlib函数来设置当前线程的CPU关联性。您可能可以使用cgo和call
pthread_setaffinity_np,因为显然Go在cgo模式下使用pthreads。由于我们在谈论系统调用,因此详细信息将因操作系统而异。

(如果您的整个程序是纯Go语言(没有C链接),则可以通过模块sched_setaffinity用零pid参数进行调用syscall。但这很棘手。)

2020-07-02