并不是所有的场景都适合绑定的,当出现内存交叉访问,或者缓存命中较低时,或者你想把某进程运行在特定的CPU上时可以进行绑定。
那么除了交叉内存访问,还有什么值得我们去绑定进程呢?

内存贬值

如果很多进程运行在CPU的某一个核心之上,我们都知道,CPU核心都是和L1直接打交道的,各个进程间切换着轮流运行,如果L1中全部缓存了进程A的数据,那么当我进程B或进程C运行时,极有可能会置换L1中的缓存数据,如果A进程没有运行完,当进程A再次执行时,还需要去置换L1中的缓存数据,这样,各个进程运行时可能每次都要置换L1中的数据,可能大部分时间都浪费在了置换缓存上,所以,我们可以将对性能敏感的进程绑定到某一个或一组核心,将多线程的程序也绑定到某一核心,这样,将大大提高服务器性能。

numastat

显示进程与每个numa节点的内存分配的统计数据和分配的成功与失败情况
内容摘自文章:https://www.cxymm.net/article/qq_34612223/109556663

平时应用程序在运行时都是由操作系统管理的。操作系统对应用进程进行调度,使其在不同的核上轮番运行。
对于普通的应用,操作系统的默认调度机制是没有问题的。但是,当某个进程需要较高的运行效率时,就有必要考虑将其绑定到单独的核上运行,以减小由于在不同的核上调度造成的开销。

把某个进程/线程绑定到特定的cpu核上后,该进程就会一直在此核上运行,不会再被操作系统调度到其他核上。但绑定的这个核上还是可能会被调度运行其他应用程序的。
操作系统对多核cpu的调度
目前windows和linux都支持对多核cpu进行调度管理。

软件开发在多核环境下的核心是多线程开发。这个多线程不仅代表了软件实现上多线程,要求在硬件上也采用多线程技术。

多核操作系统的关注点在于进程的分配和调度。进程的分配将进程分配到合理的物理核上,因为不同的核在共享性和历史运行情况都是不同的。有的物理核能够共享二级cache,而有的却是独立的。如果将有数据共享的进程分配给有共享二级cache的核上,将大大提升性能;反之,就有可能影响性能。
进程调度会涉及实时性、负载均衡等问题,目前研究的热点问题主要集中在以下方面:

  • 程序的并行开发设计
  • 多进程的时间相关性
  • 任务的分配和调度
  • 缓存的错误共享
  • 一致性访问问题
  • 进程间通信
  • 多处理器核内部资源竞争

多进程和多线程在cpu核上运行时情况如下
每个 CPU 核运行一个进程的时候,由于每个进程的资源都独立,所以 CPU 核心之间切换的时候无需考虑上下文
每个 CPU 核运行一个线程的时候,有时线程之间需要共享资源,所以这些资源必须从 CPU 的一个核心被复制到另外一个核心,这会造成额外的开销



————————————————
版权声明:本文为CSDN博主「guotianqing」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/guotianqing/article/details/80958281