当我们在linux中为进程及其线程设置不同的处理器关联时会发生什么。
我正在尝试启动一个绑定到核心(比如1)的进程,它有两个线程,其中一个需要在其他核心上运行(比如说0)
当我尝试设置与线程不同的亲和力来处理程序执行时。但我想知道这种方法的隐藏影响。
答案 0 :(得分:3)
线程和进程大致相同。无论您是致电pthread_setaffinity...
还是使用sched_setaffinity
系统调用,它们都会影响当前线程的亲和力掩码。这可能是您的过程"线程或您创建的线程。
但请注意,pthread_create
创建的新线程会继承其创建者的CPU关联掩码[1]的副本。
这意味着设置关联和创建线程与创建线程和设置关联性不同。在第一种情况下,两个线程将在同一个处理器上竞争(这很可能不是你想要的),在第二种情况下,它们将被绑定到不同的处理器。
另请注意,虽然将线程绑定到专用处理器(核心)可能在某些情况下具有优势,但它可能也是一个非常愚蠢的事情。使用关联掩码意味着您可以限制调度程序使其运行的程序。如果您绑定线程的核心不可用,则您的线程将无法运行,故事结束 这是一个非常类似的推理/策略,如禁用交换以使系统更快" (有些用户仍然这样做!)。通过这样做,他们通常什么也得不到,他们所做的就是限制内存管理器可以做的事情,一旦用完了未使用的物理RAM,就可以删除一个提供免费页面的选项。通常这意味着从缓冲区缓存中删除或多或少有价值的东西,而不是一些未在数小时内使用的私人页面可能已被换出。
通常人们会使用亲和力,因为他们有这样的想法,即调度程序会让线程一直在处理器内核之间反弹,这很糟糕。处理器迁移确实并不便宜,但是调度程序有一种机制可以确保它在某个最小时间之前不会发生(也有/proc
个问题。在更长的时间之后,保留旧核心(TLB,缓存)的所有优点通常都会消失,因此在不同的核心上运行实际上比等待特定核心可能更好,最终可用
NUMA体系结构可能是一个不同的主题,但我假设(尽管我不确定)调度程序足够聪明,不能以静默方式将线程迁移到其他节点。但是,一般情况下,我建议不要使用亲和力。
答案 1 :(得分:0)
亲和力是限制HPC中抖动的常见第一线方法。通常,LINUX进程和线程等被限制为一小部分但足够的CPU,而应用程序则被限制为其余的CPU。
亲和力对于设备驱动程序非常有用。例如,考虑应用程序正在使用的Infiniband适配器。如果驱动程序线程被限制在与适配器相同(或没有)的NUMA节点上的CPU,则适配器将发挥最佳性能。 LINUX不知道应用程序线程,因此甚至都不会考虑对性能的任何亲和力。