现代计算机的系统架构十分复杂。在服务器中,双路处理器已经十分常见。最近Arm处理器实现双路共384核心,要知道目前Linux内核最高只支持256核,这就有点尴尬。
多路处理器将越来越普遍,对性能的影响和传统架构有不小的差别,这个议题放到后面再讨论。首先需要厘清几个概念,在计算机的主板上,有几个CPU插座,就是挂载几颗CPU,通常是Socket插槽。还有H插槽式的,主要在笔记本等小型设备。而每颗CPU可以集成很多核,又叫Core,这里Core说的是物理Core。每个物理Core又能够支持两个逻辑核。所以和CPU相关的概念至少有三个:1、处理器,是指插在主板插槽那个芯片。双路处理器是指两颗芯片。2、物理核,是在芯片中真正集成的,光刻机实打实刻出来。3、逻辑核,通过超线程技术,在物理核基础上模拟出来。这三个概念会在下面内容中,会有严格的区分。在操作系统命令中,主要看到的是逻辑核,不太关注到物理核和多路处理器。
虽然传统架构相对简单,但和现代架构要解决的问题却是一样的。我们以传统的单处理器为例,主板上搭载北桥芯片和南桥芯片。北桥芯片主要负责高速连接,通过内存控制器,连接内存和显卡。CPU通过前端总线FSB和北桥芯片读写内存和显卡。南桥芯片主要负责低速连接,如I/O接口,包括网卡和磁盘,还有键盘鼠标等。这里要画个重点,北桥芯片和南桥芯片的作用,这个很容易被忽略。
先声明下,逻辑核在高速缓存上如何共享,我没有专门研究过,可能会有所不同。在物理核上,主要有L1和L2高速缓存,L3高速缓存目前是片内共享的,即整个CPU内部共享的。更早之前,L2和L3是集成在主板上。L1高速缓存被拆分成L1d和L1i,即数据缓存和指令缓存。
说完前面的基础资料后,我们来看下一个指令执行时的延迟是什么情况。
1、如果数据在寄存器中,1个cycle。
2、如果数据在高速缓存中,3-20个cycle。
3、如果数据在主存中,则需要通过FSB,向北桥芯片的内存控制器发起读取指令,240个cycle。
上述的3个值不是精准的值,但数量级差不多。
说完以上内容,就很容易理解几个场景下,这些硬件如何影响到性能,以及影响程度有多大。
1、等待I/O,通过低速南桥芯片读写数据,对延迟影响无需赘述。
2、线程切换,线程的上下文被回写到主存,再次被调度时,至少要面对几个性能惩罚,缓存缺失,逻辑核漂移。
对于这个问题的解决,多数会采用CPU亲和的解决方案。这里有个坑,并不是相邻的逻辑核就是在一起。
3、原子操作和内存屏障,这个问题和缓存一致性协议是一起的。多核在同时读写一块内存时,都要考虑这个问题。
但我们在前面说过,L3缓存是片内共享,所以在单路处理器系统中,基本在L3缓存就解决了。包括目前由disruptor引起很火的伪共享问题,并没有所说的,对性能有那么大的影响。
4、缓存行和巨页问题,这是作为基础知识就好了。主要体现在内存管理这块。