从集成电路诞生到现在,CPU主要经历了三个发展阶段,第一阶段是提升CPU的主频。在集成电路问世6年后,摩尔就提出了摩尔定律,预言了芯片上集成的晶体管数量将每两年翻一番。摩尔定律不是自然定律,但半导体芯片发展的事实证明,摩尔的预言是准确的。芯片的技术进步主要受益于两个方面:制程变小和硅片变大。但当芯片工艺规格小于7nm的时候,就会出现量子隧穿效应,芯片量产变得困难,导致制造成本急剧上升。
第二阶段是增加核数,在单核CPU频率无法继续增加的情况下,可以通过增加CPU的核数来提升算力。但CPU只是逻辑计算单元,必须把内存中的程序和数据加载到CPU中才能进行计算。所有CPU核都是通过共享一个北桥来读取内存,随着核数的快速发展,北桥在响应时间上的性能瓶颈越来越明显。
第三阶段是CPU核NUMA化,为了解决北桥中读取内存的部分即内存控制器的瓶颈,可以把内存平均分配在各个die上,但这导致了不同CPU核访问不同内存时延的非对称性。原因是虽然内存直接attach在CPU上,但当CPU访问自身直接attach内存对应的物理地址时(即Local Access),响应时间较短。如果访问其他CPU attach的内存数据(即Remote Access),就需要通过inter-connect通道访问,响应时间就会变慢。这也是NUMA(Non-Uniform Memory Access)名称的由来。在NUMA架构下,NUMA Node的处理器和内存块的物理距离被称为NUMA距离,通过numactl工具可以查询到CPU访问的距离信息。以鲲鹏服务器为例,图示如下:
CPU NUMA化给服务器带来澎湃算力的同时,也给软件开发带来了很大挑战。从整个IT软件栈来看,首先需要对NUMA化进行支持的是操作系统,现在通用的企业操作系统是Linux操作系统。在NUMA出现后,Linux也提供了针对性的优化方案,优先尝试在请求线程当前所处的CPU的Local内存上分配空间。如果local内存不足,优先淘汰local内存中无用的Page。但Linux提供的NUMA内存使用方式并不适合数据库,因为数据库是一个数据密集型高并发的应用,内部有很多的内核数据结构&#