CPU亲和性是默认开启的吗?
听说 Nginx
有很多优化手段,其中一个就是使用 CPU 亲和性,让 work
进程尽量跑在同一个 CPU core
上(这里的 core 我不清楚是物理 core 还是逻辑 core),来减少 cache 失效
这个 CPU 亲和性是只对进程又用还是,线程也可以设置亲和性?
但是我有一些疑问,就是比如我随便用 java
和 python
写点多线程,或者多进程的代码,这个时候操作系统是默认用 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