文章目录
- 1. CPU结构变化
- 2. CPU与编程语言的关系
- 3. 内存结构变化
- 4. 内存分类
- 5. 内存逻辑模型
- 6. CPU与内存的关系
- 7. 硬盘介绍
- 参考文档
1. CPU结构变化
在短短的IT发展历史中,计算机经历了从大到小,计算能力逐渐增强的变化,但由CPU,内存,硬盘构成的硬件基本结构未发生根本变化。计算机硬件不是百分百可靠的,这种不确定性严重影响了服务的可靠性,也推动产生了各种冗余技术,包括CPU集群、内存冗余、RAID技术、网卡绑定、电源冗余、虚拟机克隆、虚拟机快照、分布式文件系统和各种应用层软件的负载均衡等。
CPU内部由运算单元、控制单元(包括指令寄存器,指令计数器)、存储单元(包括多级缓存等多种寄存器)组成。指令计数器负责指向当前正在执行的指令位置,并在指令被取出执行后,指向下一条指令。运算单元负责根据指令进行数据计算,由于运算单元的指令和数据都是从内存取出的,但是内存的运行速度远远低于运算单元的运行速度,所以CPU出现了多级缓存。
图1 CPU最低缓存配置
图1架构应用于部署CPU缓存的早期系统中。CPU内核不再直接连接到主存储器,所有的加载和存储都必须经过缓存。CPU内核与缓存之间的连接是一种特殊的快速连接。在图2-1的简化表示中,主存储器和缓存连接到系统总线,该系统总线也可用于与系统的其他组件进行通信。通常将系统总线称为“FSB”。
一个简单的计算可以显示理论上缓存的有效性。假设对主存储器的访问需要200个周期,而对缓存的访问则需要15个周期。如果没有缓存,则使用100个数据元素进行100次编码将在内存操作上花费2,000,000个周期,如果可以缓存所有数据,则仅花费168,500个周期,时间缩短了91.5%。
用于高速缓存的SRAM的容量比主存储器小很多倍。根据经验,缓存大小始终约为主内存大小的1/1000(例如4MB缓存和4GB主存)。过去几十年的计算机使用了冯﹒诺依曼计算机架构,但实际经验表明,分离用于代码和数据的缓存是有利的。自1993年以来,英特尔一直使用独立的代码和数据缓存。代码和数据所需的缓存区域几乎彼此独立,这就是独立的缓存可以更好地工作的原因。
引入缓存后不久,系统变得更加复杂。高速缓存与主内存之间的速度差异再次增大,以至于添加了另一级高速缓存,该级别比第一级高速缓存更大,更慢。由于速度原因,仅增加一级缓存的大小是不可行的。随着单个CPU中内核数量的增加,将来缓存级别的数量可能还会增加。
图2 具有三级缓存的处理器
L1d是1级数据高速缓存,L1i是1级指令高速缓存,以此类推。实际上,数据流在从核心到主存储器的过程中不需要通过任何更高级别的缓存。
处理器具有多个核心,每个核心可以具有多个线程。核心和线程之间的区别是:单独的核心具有各自的硬件资源,除非核心同时使用相同的资源,否则它们可以完全独立地运行;而另一方面,线程几乎共享处理器的所有资源。
图3 多处理器,多核,多线程的现代CPU
图3中有两个处理器,浅灰色阴影表示处理器,深灰色阴影表示CPU核心,每个处理器都有两个内核,每个内核都有两个线程。线程共享1级缓存。
2. CPU与编程语言的关系
CPU是整台计算机的核心,相当于人类的“大脑”,承担着所有的计算工作。CPU只能识别由0和1组成的机器语言,由于人类无法使用机器语言进行程序编写,于是出现了便于人类使用的汇编语言[10]。所有的汇编语言最后全部都会被转换成机器语言,被计算机读取并执行。汇编语言是与硬件特性相关的,所以不能跨平台使用。
以生产环境中占据重要地位的Linux为例,Linux操作系统由少量的汇编语言和大量的C语言组成。汇编语言用于硬件相关的驱动编写。实际上在底层,所有的C语言,也是经过编译,转换成汇编语言进行运行的。因为C语言能够根据不同的硬件,编译成不同的汇编语言,所以C语言编写的程序可以跨平台运行,这也是C语言的高级特性之一。JAVA语言的“一次编译,到处运行”也是类似,只是需要安装JAVA虚拟机进行编译。
3. 内存结构变化
多年来,个人计算机和小型服务器在芯片组上进行标准化,并由两部分组成:北桥和南桥:
图4 南桥和北桥的结构
所有CPU通过一条公共总线(Front Side Bus,FSB)连接到北桥。除其他器件外,北桥还包含内存控制器,内存控制器确定了用于计算机的RAM芯片的类型。不同类型的RAM,例如DRAM,SDRAM等,需要不同的内存控制器。
要访问所有其他系统设备,北桥必须与南桥通信。南桥,通常称为I/O桥,通过各种不同的总线处理与设备的通信。如今,PCI,PCI Express,SATA和USB总线是最重要的,但是南桥也支持PATA,IEEE 1394,串行和并行端口。较早的系统具有连接到北桥的AGP插槽。这样做是为了解决性能问题,北桥和南桥之间的连接速度不够快引发了性能问题。但是今天,通过使用PCI-E插槽,已经可以正常连接到南桥。
这样的系统结构具有许多值得注意的后果:
1.从一个CPU到另一个CPU的所有数据通信必须通过用于与北桥通信的同一总线传输。
2.与RAM的所有通信都必须通过北桥。
3.RAM只有一个端口。
4.CPU和连接到南桥的设备之间的通信通过北桥进行路由。
在PC的早期,该设计有两个瓶颈。第一个瓶颈是与任一网桥上的设备进行的所有通信都必须通过CPU,这会对整体系统性能产生负面影响。为了解决此问题,某些设备开始使用直接内存访问(DMA)技术。DMA允许设备在北桥的帮助下直接在RAM中存储和接收数据,而无需CPU的干预,不会影响CPU的性能。如今,连接到任何总线的所有高性能设备都可以使用DMA。尽管这大大减少了CPU的工作量,但由于DMA请求与来自CPU的RAM访问竞争,这也导致了北桥带宽的争夺。
第二个瓶颈是从北桥到RAM的总线。总线的详细信息取决于部署的内存类型。在较旧的系统上,所有RAM芯片只有一条总线,因此无法并行访问。DDR2的RAM类型需要两条单独的总线,这将使可用带宽增加一倍。
在某些更昂贵的系统上,北桥实际上不包含内存控制器。相反,北桥可以连接到多个外部存储器控制器。
图5 带有外部控制器的北桥
这种体系结构的优点是存在多个内存总线,因此总带宽增加了。此设计还支持更多内存。并发存储器访问模式通过同时访问不同的存储体来减少延迟。
使用多个外部内存控制器不是增加内存带宽的唯一方法。另一种越来越流行的方式是将内存控制器集成到CPU中,并将内存连接到每个CPU。
图6 集成内存控制器
使用这样的架构,可用的存储体和处理器一样多。在四核CPU机器上,内存带宽增加了三倍,而无需使用巨大带宽的复杂北桥。
这种架构也有缺点。首先,由于机器仍必须使所有处理器都可以访问系统的所有内存,因此内存不再是统一的。CPU可以以正常的速度访问连接到该处理器的内存,当访问连接到另一个处理器的内存时情况就不同了。在这种情况下,必须使用处理器之间的互连。要从CPU 1访问连接到CPU 2的内存,需要通过一个互连进行通信。当CPU 1访问连接到CPU 4的内存时,必须使用两个互连。
4. 内存分类
同一台计算机中存在不同类型的RAM,静态RAM(SRAM)和动态RAM(DRAM)。前者速度更快,并且提供相同的功能,但因为SRAM的生产和使用成本比DRAM高得多,所以不是所有的RAM都是SRAM。一个DRAM单元所需的芯片空间比SRAM单元小许多倍。SRAM单元还需要单独的电源来使晶体管保持状态。DRAM单元的结构也更简单,更规则,这意味着将它们紧密堆积在一个芯片上更为简单。
当系统启动一个程序,CPU便会从硬盘读取数据放到内存,内存作为加工临时数据的车间存在。一般来说,系统拥有的RAM越多,程序运行就越快。当然系统内存的增加有2种思路:增加物理内存或者虚拟内存。处理器的虚拟内存子系统实现提供给每个进程的虚拟地址空间。这使每个进程都认为它在系统中是单独的。对Linux而言,增加虚拟内存的优点是无需停机维护,缺点是传输速度不如物理内存快,毕竟虚拟内存本质是CPU与硬盘交互数据。
DIMM(双列直插内存模块)有168个针脚,提供64位带宽。DIMM后来演变为SDRAM(同步DRAM)。SDRAM有ECC和非ECC两种,ECC可以检测并修复内存的小错误,较严重的错误需要更换内存。
5. 内存逻辑模型
C语言中的内存模型:
图7 内存逻辑模型
图7是从逻辑角度,在应用的情况下,将内存划分为栈,堆,静态存储区,常量存储区和代码段。其中栈,堆,静态存储区是存储变量的,常量存储区是存储字符串长亮的。栈是由系统自动分配,自动释放的,它的大小不受人控制;而堆是使用动态内存分配产生的,堆的大小由程序员直接控制。堆和栈是相对增长的,所以总体容量是有限的,在程序编写过程中,要避免出现层数太深的递归函数,导致栈的不断增长,引发栈溢出。
6. CPU与内存的关系
内存存储了与CPU交互的指令和数据,CPU与内存的关系十分紧密。目前,服务器内存多使用的速度为2666MT/s,2400MT/s,2133MT/s,1866MT/s。以英特尔SKL-SP服务器为例,介绍CPU与内存的物理配置关系:
图8 CPU内存通道示意图
每颗英特尔Skylake-SP处理器有6个内存通道,如图所示channel 0~5,分别由CPU内的2个内存控制器控制。每个内存通道最多可装载2块内存。在CPU与内存的搭配选择中,有以下4点需要注意:
1、不同型号的CPU的最大传输速率不同:
图9 同品牌不同型号CPU的传输速度
由图9可知,81xx系列的CPU最大的传输速率为2666MT/s,约为1333Mhz,而31xx系列的CPU最大传输速率为2133MT/s,约为1066Mhz。由此可见,不同的CPU,与内存之间的传输速度有一定的区别,具体如何选择,需要结合自身业务需求。如服务器作为Redis或Memcache服务器,则需要使用大容量,高速度的内存,并搭配较高速率的CPU;如服务器用作冷数据的存储,则需要使用大容量硬盘,搭配一般速率的CPU即可。
2、同型号的CPU,搭配不同容量的内存,传输速度的差距并不悬殊。
图10 搭载12条内存的CPU传输速度的比较
如图10所示,如使用8176型号的CPU,驱动12条内存,无论内存容量是32G、16G还是8G,速率差距并不是那么大。实际上,16G内存的速度还要大于8G内存和32G内存的速度。
3、CPU与内存的搭配需要考虑平衡。如果有1、2或3块内存,使用单通道的排列即可,由1个内存控制器承担工作任务;如果有4或6块内存,就需要使用双通道的排列了,由2个内存控制器平衡的工作;不建议使用5块内存,数据存取不平衡,影响数据传输速度,出现问题的概率较大。如图11所示:
图11 数据传输平衡与内存数量紧密相关
4、超过一定阈值,内存容量对内存传输速度的影响较大。
图12 传输速度与内存容量相关
图12所示,DELL C6420有16个DIMM插槽,使用12个插槽的速度为206135位每秒,使用全部16个插槽,传输速度变为了72380位每秒,只有原来的35%,这对性能的影响非常巨大。
7. 硬盘介绍
硬盘是整个IT系统中最易损耗的部件了,这里简单的将硬盘分为两种,机械硬盘和固态硬盘。这两种硬盘是有很大区别的。机械硬盘是由主轴,盘片,磁头等机械部件构成,因为成本相对较低,所以容量较大。在企业环境中,4T或8T的硬盘很常见,并且有一定的可靠性,但在数据中心这样的IT设备密集场所,每天都需要更换数块硬盘。固态硬盘使用闪存颗粒来存储数据,抛弃了机械部件,所以读取速度更快,可靠性更高,但是成本相对较高,导致容量较低,目前一般不超过1T。
这里说的是企业级的硬盘,与日常生活中适用于家庭和个人的普通硬盘是不一样的,主要区别在于AFR(24×7 不间断运行的可靠性级别)不同,多级缓存的大小不同。企业级机械硬盘的AFR一般为0.44%,多级缓存一般可以达到256MB;而普通机械硬盘AFR一般只能保证小于1%,多级缓存一般为64MB。设计目的、制作工艺、应用场景的差别,导致普通硬盘和企业级硬盘存在一定的差异。
参考文档
[1]赵岩.C语言点滴[M].人民邮电出版社:北京,2013:1.
[2]Dell Inc…模块化系统 CPU 和内存配置可能会影响性能[EB/OL].模块化系统-cpu-和内存配置可能会影响性能?lang=zh,2019-09-14.
[3]Ulrich Drepper. What every programmer should know about memory[EB/OL]. https://lwn.net/Articles/252125/,2007-10-01.
2019年写的,不严谨,将一些基础知识汇总了一下。当时写了很努力,写完很满意,现在看来,还有很大差距。