什么是处理器亲和性?

2025年6月26日 | 阅读7分钟

处理器亲和性(Processor Affinity)是指一个进程对当前运行它的处理器具有亲和性。当一个进程在一个特定的CPU上执行时,会影响到缓存内存。处理器的缓存会填充进程最近访问的数据,因此后续的内存访问通常可以在缓存内存中得到满足。假设进程被迁移到另一个CPU。在这种情况下,第一个处理器的缓存内容必须被无效化,而第二个处理器的缓存必须被重新填充。大多数对称多处理(SMP)系统试图通过让同一个进程运行在同一个处理器上来避免进程迁移,因为无效化和重新填充缓存的过程代价高昂。

处理器亲和性也称为“缓存亲和性”(cache affinity)。它可以将进程或线程绑定或解绑到单个CPU或一组CPU上,并确保进程或线程仅在指定的CPU上执行,而不是在任何其他CPU上执行。这是对称多处理操作系统原生中央队列调度算法的一种修改。队列中的每个项目都有一个标签,指定其“亲缘”处理器。在资源分配时,每个任务在分配给其他任务之前,都会被分配到其“亲缘”处理器。

处理器亲和性利用了这样一个事实:一个进程在某个处理器上运行后,其残留部分可能在该处理器状态中保留,即使之后另一个进程在该处理器上运行。将一个中断少、CPU密集型进程调度到同一个处理器上运行,可以通过减少缓存未命中等性能下降事件来提高性能。然而,这可能会减慢其他程序的运行速度,因为它们必须等待该处理器再次可用。使用非线程应用程序的许多例子,如图形渲染软件,是处理器亲和性的真实应用实例。

调度算法的实现对其遵循处理器亲和性的程度有所不同。一些实现会允许任务在某些条件下为了提高效率而切换到另一个处理器。例如,如果两个CPU密集型进程(A和B)对一个处理器有亲和性,而另一个处理器保持空闲,许多调度器会将任务B转移到第二个处理器上,以最大化CPU利用率。任务B将对第二个处理器产生亲和性,而任务A将保留对原始处理器的亲和性。

处理器亲和性的作用是什么?

处理器亲和性可以有效地减少缓存问题,但它不能解决持久的负载均衡问题。例如,一个拥有两个双核超线程CPU的系统给调度算法带来了困难的任务。

超线程在同一核心上运行的两个虚拟CPU之间产生了完美的亲和性。同一物理处理器上的两个核心之间存在某种亲和性,但不同物理处理器之间不存在亲和性。由于其他资源是共享的,因此处理器亲和性本身可能不足以用于调度CPU。假设一个进程在一个给定核心上的虚拟超线程CPU上执行,而该虚拟CPU当前正忙,且该CPU不是它的“伙伴”。在这种情况下,缓存亲和性表明该进程应该被调度到空闲的“伙伴”处理器上。尽管如此,两个虚拟处理器在计算、内存资源和缓存内存方面几乎所有资源都在竞争。如果只有一个处理器可用,将其路由到另一个核心或处理器通常更有效。这可能会在进程重新填充缓存时产生性能损失,但由于它不必竞争CPU资源,因此可能会提高整体性能。

处理器亲和性与绑定

处理器亲和性是指将一个线程调度到之前正在执行它的处理器的可能性。对处理器亲和性的重视程度应与线程的缓存工作集的大小成正比,与自上次调度以来经过的时间成反比。AIX® Version 4调度器强制执行与处理器的亲和性,因此亲和性由操作系统隐式完成。

如果一个线程被中断,之后又被重新调度到同一个处理器上,该处理器的缓存可能仍然包含属于该线程的行。如果线程被调度到另一个处理器上,直到其缓存工作集从RAM或其他处理器的缓存中检索出来,它可能会经历一系列缓存未命中。另一方面,如果一个可调度的线程必须等待之前运行它的处理器可用,该线程可能会经历更长的延迟。

最高程度的处理器亲和性是将线程绑定到特定处理器。绑定意味着该线程只能被调度到该处理器,而不考虑其他处理器的可用性。bindprocessor命令和bind processor()子程序将指定进程的线程(或线程)绑定到特定处理器。显式绑定通过fork()和exec()系统调用继承。

绑定对于中断少的CPU密集型程序可能很有用。对于普通程序来说,它有时会适得其反,因为它可能会在I/O操作后延迟线程的重新调度,直到线程绑定的处理器可用。如果线程在I/O操作期间被阻塞,它在被绑定的处理器的缓存中残留的处理器上下文可能很少。如果线程被调度到下一个可用处理器,它可能会得到更好的服务。

一些更典型的亲和性设置包括

  • 为所有系统进程保留一个CPU核心,允许应用程序在剩余的核心上运行。
  • 允许线程应用程序和给定的内核线程(如网络软中断或驱动程序线程)在同一个CPU上运行。
  • 在每个CPU上配对生产者和消费者线程。

建议亲和性设置应与程序一起设计,以更好地匹配预期的行为。

在实时系统上调整亲和性的常规做法是确定运行应用程序所需的内核数量,然后隔离这些内核。这可以通过Tuna工具或使用shell脚本修改位掩码值来实现。taskset命令可用于更改进程的亲和性,而修改/proc文件系统条目则可以更改中断的亲和性。

处理器亲和性类型

处理器亲和性主要有两种类型。它们如下:

  1. 软亲和性
  2. 硬亲和性

软亲和性

“软亲和性”(soft affinity)是指操作系统将进程保持在同一个处理器上运行的策略,但它不能保证一定会这样做。

硬亲和性

它允许进程定义一个它可以执行的处理器子集。像Linux这样的某些操作系统实现了软亲和性,并提供了系统调用,例如sched setaffinity(),它们支持硬亲和性。

使用CPU亲和性的优点

  • 性能优化:通过减少上下文切换和提高数据局部性,CPU亲和性可以带来更好的缓存性能和更低的内存访问延迟。
  • 稳定性和可预测性:将关键进程分配给专用核心可以提高系统可靠性和可预测性,尤其是在高性能计算环境中。
  • 资源管理:它允许更好地控制虚拟化环境中的资源分配,在这种环境中,管理多个虚拟机的性能至关重要。

使用CPU亲和性的缺点

  • 灵活性降低:将进程限制在特定核心会降低系统对不断变化的负载的适应性,并可能导致可用资源的利用不足。
  • 管理复杂性:监控和调整CPU亲和性设置会增加系统管理的复杂性,尤其是在动态环境中。
  • 可能导致性能下降:如果管理不当,设置严格的亲和性可能会导致问题,例如延迟增加或瓶颈,如果指定的内核过载或遇到硬件问题。

常见问题解答:-

操作系统处理器亲和性是什么意思?

进程或线程可以通过一种称为处理器亲和性的机制链接到特定的CPU或一组CPU。通过减少重新加载数据的需要,增加CPU缓存的重用,并将进程绑定到特定处理器,这有助于优化执行。

处理器亲和性如何提高多核系统的性能?

线程通过坚持在单个CPU上并使用该CPU缓存中已有的数据,可以更快地访问内存。它还消除了不必要的CPU迁移,并降低了上下文切换的成本。

硬亲和性与软亲和性有何区别?

软亲和性告诉操作系统倾向于哪些CPU,但调度器仍可在必要时移动线程。相反,具有硬亲和性的线程被紧密绑定到指定的CPU,并且操作系统不会移动它们,除非被明确重新配置。

处理器亲和性设置是否会导致性能下降?

是的,尤其是在运行多个进程的系统中,过度限制线程到CPU可能会导致CPU过载和不平衡。它降低了调度器最大化系统性能的灵活性。

Linux和Windows中处理器亲和性的程序化设置是什么?

在Windows中,使用SetProcessAffinityMask()和SetThreadAffinityMask()等API来指定处理器亲和性。在Linux中,可以通过taskset命令行实用程序或sched_setaffinity来设置线程或进程的CPU亲和性。