1

当我们在 linux 中为进程及其线程设置不同的处理器亲和性时会发生什么。

我正在尝试启动一个与内核(比如 1)关联的进程,该内核有两个线程,其中一个线程需要在另一个内核上运行(比如 0)

当我尝试将亲和力设置为不同的线程以处理程序时被执行。但我想知道这种方法的隐藏影响。

4

2 回答 2

3

线程和进程在很大程度上是一回事。无论您调用pthread_setaffinity...还是使用sched_setaffinity系统调用,它们都会影响当前线程的关联掩码。这可能是您的“进程”线程,或者您创建的线程。

但是,请注意,由创建的新线程pthread_create继承其创建者的 CPU 关联掩码[1]的副本。

这意味着设置亲和力和创建线程与创建线程和设置亲和力不同。在第一种情况下,两个线程将在同一个处理器上竞争(这很可能不是您想要的),在第二种情况下,它们将绑定到不同的处理器。

另请注意,虽然将线程绑定到专用处理器(内核)在某些情况下可能具有优势,但它也可能是一件非常愚蠢的事情。使用关联掩码意味着您限制调度程序可以执行的操作以使您的程序运行。如果您将线程绑定到的核心不可用,那么您的线程将不会运行,故事结束。
这是与禁用交换以使系统“更快”的非常相似的推理/策略(有些用户仍然这样做!)。通过这样做,他们通常一无所获,他们所做的只是通过删除一个选项来限制内存管理器可以做的事情,即在未使用的物理 RAM 用完时提供一个空闲页面。通常这意味着从缓冲区缓存中或多或少有价值的东西被清除,而一些几个小时内未使用的私有页面可能已被换出。

通常人们使用亲和力是因为他们认为调度程序会让线程一直在处理器内核之间反弹,这很糟糕。处理器迁移确实不便宜,但调度程序有一种机制可以确保它不会在某个最短时间之前发生(也有一个/proc事情)。更长的时间后,停留在旧核心(TLB,缓存)的所有优势通常都会消失,因此在现成可用的不同核心上运行实际上比等待特定核心可能最终变得可用要好.

NUMA 架构可能是一个不同的主题,但我假设(尽管我不确定)调度程序足够聪明,不会默默地将线程迁移到不同的节点。但是,总的来说,我建议根本不要玩亲和力。

于 2014-12-12T12:39:34.487 回答
0

亲和性是限制 HPC 中抖动的常用一线方法。通常,LINUX 进程和线程等被限制在一小部分但足够多的 CPU 上,而应用程序则被限制在其余的 CPU 上。

Affinity 对于设备驱动程序非常有用。例如,考虑一个应用程序正在使用的 Infiniband 适配器。如果驱动程序线程被限制在与适配器相同(或最接近,如果没有)NUMA 节点上的 CPU 上,则适配器的性能最佳。LINUX 不知道应用程序线程,因此甚至不能考虑任何性能相关性。

于 2020-02-03T19:55:41.847 回答