听说 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 核的负载和任务状态来调度,假如被绑定的核很繁忙系统会将其他任务调度到未被绑定的核。这部分是操作系统进程调度的基本功能。