何为CPU的亲和性

CPU的亲和性,进程要在某个给定的 CPU 上尽量长时间地运行而不被迁移到其他处理器的倾向性,进程迁移的频率小就意味着产生的负载小。亲和性一词是从affinity翻译来的,实际可以称为CPU绑定。

在多核运行的机器上,每个CPU本身自己会有缓存,在缓存中存着进程使用的数据,而没有绑定CPU的话,进程可能会被操作系统调度到其他CPU上,如此CPU cache(高速缓冲存储器)命中率就低了,也就是说调到的CPU缓存区没有这类数据,要先把内存或硬盘的数据载入缓存。而当缓存区绑定CPU后,程序就会一直在指定的CPU执行,不会被操作系统调度到其他CPU,性能上会有一定的提高。

另外一种使用CPU绑定考虑的是将关键的进程隔离开,对于部分实时进程调度优先级提高,可以将其绑定到一个指定CPU核上,可以保证实时进程的调度,也可以避免其他CPU上进程被该实时进程干扰。

我们可以手动地为其分配CPU核,而不会过多的占用同一个CPU,所以设置CPU亲和性可以使某些程序提高性能。

Linux操作系统的CPU亲和性特征

操作系统部分Linux的调度程序同时提供”软CPU亲和性”和”硬CPU亲和性”

软亲和性:进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他CPU。

Linux 内核进程调度器天生就具有被称为 软 CPU 亲和性(affinity) 的特性,因此linux通过这种软的亲和性试图使某进程尽可能在同一个CPU上运行。

硬亲和性:将进程或者线程绑定到某一个指定的cpu核运行

虽然Linux尽力通过一种软的亲和性试图使进程尽量在同一个处理器上运行,但它也允许用户强制指定进程无论如何都必须在指定的处理器上运行。

硬亲和性使用场景

硬亲和性场景:需要保持高CPU缓存命中率时、需要测试复杂的应用程序时。

保持高CPU缓存命中率:如果一个给定的进程迁移到其他地方去了,那么它就失去了利用CPU 缓存的优势。实际上,如果正在使用的CPU 需要为自己缓存一些特殊的数据,那么所有其他CPU 都会使这些数据在自己的缓存中失效。因此,如果有多个线程都需要相同的数据,那么将这些线程绑定到一个特定的CPU 上是非常有意义的,这样就确保它们可以访问相同的缓存数据(或者至少可以提高缓存的命中率)。否则,这些线程可能会在不同的CPU 上执行,这样会频繁地使其他缓存项失效

NUMA的由来

NUMA(Non-Uniform Memory Access),即非一致性内存访问,是一种关于多个CPU如何访问内存的架构模型。

NUMA出现之前,所有CPU对内存的访问都要通过北桥来完成。此时所有CPU访问内存都是“一致的”。

这样的架构称为UMA(Uniform Memory Access),直译为“统一内存访问”,这样的架构对软件层面来说非常容易,总线模型保证所有的内存访问是一致的,即每个处理器核心共享相同的内存地址空间。但随着CPU核心数的增加,这样的架构难免遇到问题,比如对总线的带宽带来挑战、访问同一块内存的冲突问题。

为解决上述问题,NUMA架构出现了,即不同的内存器件和CPU核心从属不同的Node,每个Node都有自己的内存控制器。BIOS将收集到的Node信息通过ACPI报告给操作系统,OS就可以根据NUMA节点间的距离远近访问距离自己最近的内存,从而降低总线堵塞和提高性能。

NUMA距离

NUMA距离意指NUMA节点之间的逻辑距离,距离越近访问延迟越低。

Linux下可使用numactl -H查看NUMA距离

参考:

关于CPU亲和性,这篇讲得最全面 – 腾讯云开发者社区-腾讯云

https://forum.huawei.com/enterprise/zh/thread/590169249215823872