CPU亲和性是默认开启的吗?

听说 Nginx 有很多优化手段,其中一个就是使用 CPU 亲和性,让 work 进程尽量跑在同一个 CPU core 上(这里的 core 我不清楚是物理 core 还是逻辑 core),来减少 cache 失效

这个 CPU 亲和性是只对进程又用还是,线程也可以设置亲和性?

但是我有一些疑问,就是比如我随便用 javapython 写点多线程,或者多进程的代码,这个时候操作系统是默认用 CPU 亲和性还是不用?

或者说 Win、Linux、Mac、FreeBSD 等等操作系统是默认开还是不开?

我还有一个疑问就是,这玩意真的可以提高性能?CPU 在不停的干活,进程的调用都哪个 CPU 有空,就让哪个 CPU 来干活,现在因为『亲和性』要还专门等那个 CPU 空闲才行,这样就要 wait cpu,反而会更慢吧?!


回答:

CPU 的物理核心跟内存之间还有很多级缓存 ( L1, L2, L3 ),这些缓存的存取速度快于内存,是 CPU 内置的用来加速数据访问的。不同的 CPU 物理核之间的缓存并不是共享的,因为一旦共享就会有很多的同步和并发读写安全问题。设置 CPU 亲和性可以保证进程不会频繁的在 CPU 物理核之间调度,提高缓存命中率。

Linux 内核提供了设置进程和线程的亲和性系统调用。

Windows 也提供了类似 Linux 的系统调用实现进程、线程的亲和性设置。

所有系统都没有默认的亲和性设置行为,因为操作系统的目的是为了提供一个稳定可靠的系统,对用户维度的控制应该由用户自己决定。

设置完亲和性之后,操作系统会根据 CPU 核的负载和任务状态来调度,假如被绑定的核很繁忙系统会将其他任务调度到未被绑定的核。这部分是操作系统进程调度的基本功能。


回答:

CPU 亲和性是不默认开启的,需要手动设置。CPU 亲和性是指将线程或进程绑定到特定的 CPU 核心上运行的技术。在多核 CPU 中,如果没有设置 CPU 亲和性,操作系统会将进程随机分配到不同的 CPU 核心上运行,而这种随机分配会导致 CPU 缓存未命中、上下文切换等问题,从而影响程序的性能。因此,在某些情况下,为了提高程序的性能,我们需要手动设置 CPU 亲和性,将程序绑定到特定的 CPU 核心上运行。在 Linux 系统中,可以使用 sched_setaffinity 系统调用设置 CPU 亲和性。在 Windows 系统中,可以使用 SetProcessAffinityMask 函数设置 CPU 亲和性。

以上是 CPU亲和性是默认开启的吗? 的全部内容, 来源链接: utcz.com/p/944594.html

回到顶部