如何判断一个多核机器(Linux)是否为NUMA结构
Redhat 或者Centos系统中可以通过命令# grep -i numa /var/log/dmesg 查看输出结果:
如果输出结果为:
No NUMA configuration found
说明numa为disable,如果不是上面的内容说明numa为enable
看起来似乎有强行把芯片设计和数据中心建设拉到一起尬聊的感觉,但世间也没有那么多的一见如故,一些有意义的讨论未尝不是从尬聊开始的。
就我个人而言,今年已经多次在关于数据中心的文章和(线上)分享中提到AMD:“从1月29日开始到2月6日,腾讯会议每天都在进行资源扩容,日均扩容云主机接近15万台,8天总共扩容超过10万台云主机,共涉及超百万核的计算资源投入,全部由腾讯云自研的服务器星星海提供支撑。”这款服务器基于AMD去年8月发布的代号Rome(罗马)的第二代EPYC处理器,最大的特点就是核多——双路配置再算上超线程,一台采用腾讯云定制版EPYC处理器的星星海服务器可以为云服务器提供多达180个核——也就是说,这100万核服务器资源,“只”需要不到6000台该款自研服务器即可满足。
腾讯云星星海SA2服务器采用2U高度结合类似远程散热片(remote heat-sink)的设计,配合6个60mm风扇,据称可以支持2个300W级别的CPU(AMD第二代EPYC处理器公开版本最高TDP为280W)
实际上,官方名称为AMD EPYC 7002系列的第二代EPYC处理器最多能提供64个核芯、128个线程,腾讯云定制版本选择了48核芯(96线程)而已。至少在CPU的核数(core count)上,AMD给Intel(英特尔,昵称“大英”)造成了很大的压力。上个月英特尔发布了代号为Cooper Lake的第三代至强可扩展处理器(Xeon Scalable Processor,XSP),主打四路和八路市场,四路配置可提供112核芯224线程,核数上堪与双路EPYC 7002系列抗衡,为10nm制程的Ice Lake争取时间。
摩尔定律难以延续的后果就是CPU的功耗持续攀升,第一代至强可扩展处理器(公开版)里TDP最高的205W,到第三代已是寻常,250W算是克制——毕竟要考虑四路的散热需求
话说上一次AMD搞得大英如此狼狈,还要追溯到本世纪初的64位路线之争。众所周知,英特尔是x86及其生态(特别是软件生态)的缔造者,属于“亲妈”级别,AMD充其量是个“后妈”。但是,x86几十年的发展史证明,“亲妈”未必就比“后妈”更了解孩子的发展潜力。也可以前一阵大火的剧集《隐秘的角落》为例,看完就会发现,对于朱朝阳的隐藏能力,后妈的认知似乎先于亲妈。
Cooper Lake:你看我还有机会吗?
简单的说,Intel建立发展x86生态,AMD坚定捍卫x86路线——不断改造作为生态核心的x86处理器,焕颜新生
盛衰无常:架构与制程的双簧
虽然已经在过去十年中逐渐沦为爱好者口中的“牙膏厂”,但在历史上,英特尔一直不乏创新精神。对待x86的态度可以算是这种精神的一个体现,起码在进入64位时代之前,英特尔其实不太瞧得上x86,总觉得这个娃太low——可能是亲妈更了解孕育过程中的种种先天不足吧——几次三番地在重大的转折点,想要“与时俱进”,重起炉灶,带给用户“船新体验”。反而是AMD屡屡在关键时刻出来捍卫x86,通过翻新加盖来维持其生命力。
64位是关键的转折点。上世纪九十年代末,还是32位的x86刚“插足”服务器市场不久,英特尔选择与惠普(HP)联手开发基于IA-64架构的Itanium(安腾)作为接班人,与已经64位了的RISC阵营大佬们对抗。然而,AMD认为x86还可以抢救一下,决定通过64位扩展来“续命”,并在2003年4月发布首款64位x86处理器Opteron,两年后又把x86(-64)带入多核时代。
此时,英特尔已经在IA-64的路上走了十多年。时过境迁,当初设定的目标并没有实现,而x86扩展到64位和多核之后,不仅软件和应用的生态系统得到了完整的继承,性能也完全可以一战。用户用脚投票,大英不得不从。
第二代EPYC处理器发布会上,Google出示2008年7月9日上线的其第100万台服务器的照片,追诉与AMD的革命友情……还是台四路服务器
英特尔痛定思痛,决定用架构和制程构筑双保险,在2007年提出了Tick-Tock(取自于时钟的“嘀-嗒”周期)量产模式,即先通过制程升级将芯片面积缩小,是为Tick;再基于操练纯熟的制程改用新的微架构,是为Tock。当时的英特尔工厂在技术和产能上都占据明显优势,只要架构上回到正轨,左右手组合拳一出,产量受限的AMD哪里支撑得住?在2008年推出Nehalem微架构之后,英特尔终于夺回主动权。
在英特尔施加的强大压力下,AMD在处理器架构上也犯了错误,2011年推出的Bulldozer(推土机)架构采用了即使现在看来也过于激进的模块化设计。随着2012年英特尔开启至强E5时代,AMD在节节失利后不得不退出服务器市场,上一个巅峰期彻底结束。
有道是:福兮祸所依,祸兮福所伏。先贤曾经曰过:纵有架构、制程双保险,奈何CEO是单点。2016年英特尔推出最后一代至强E5/E7(v4),这是英特尔首批采用14nm制程的服务器CPU,同时也宣告了Tick-Tock模式的终结,改用Process–Architecture–Optimization (制程-架构-优化)的三步走模式。
在这个可以简称为PAO的模式里,虽然仍是先制程、后架构的节奏,但新加入的优化不管是针对两者中的哪一个还是兼而有之,都起到了拉长制程换代周期的效果。第三代至强可扩展处理器已经是第四波采用14nm制程的服务器CPU,14nm后面的“+”都数不清楚有几个了——还好预计年底发布的Ice Lake将终止这个“土拨鼠之日”式的制程循环。
架构层面上,从代号Skylake的初代至强可扩展处理器开始,由环形总线改为6×6的2D-mesh,然后持续“优化”。在架构的角度,Mesh和环形总线都属于所谓传统的单片(Monolithic)式架构,优点是整体性好,涉及到I/O的性能比较有保证;缺点是对制程不太友好,随着规模的扩大,譬如核数和Cache的增加,良率上的挑战很大,高端产品的成本下不来,这对于追求高核数的云计算服务提供商显然不是个好消息。
至强E5/E7 v4的四环(2组双向环形总线)与至强SP的6×6 Mesh架构
关键时刻,又是沉寂多年的AMD挺身而出,接盘Tick-Tock,以自己的方式“维护”摩尔定律。
这个方式,就是模块化。
MCM:同构对等模块化的利与弊
先简单回顾一下AMD之前的模块化设计为什么会失败。 Bulldozer架构的模块化设计,建立在AMD对未来应用趋势的不靠谱假设上,即整数(Integer,INT)运算将占据绝对主导地位,结论是增加整数运算单元,减少浮点(Floating Point,FP)运算单元。 于是,Bulldozer架构很“鸡贼”的采用了两个(具有完整整数运算单元的)核芯共用一个浮点运算单元的模块化设计,两个模块就可以提供4个核芯(但只有2个浮点运算单元),6核以此类推。
模块化本身并没有错,Intel Nehalem的模块化设计就很成功。Bulldozer错在“拆东墙补西墙”,结果连补强都算不上
不用放马后炮,这也是一个妄揣用意(用户意志)的行为。即使是在AI大行其道的今天,第二代英特尔至强可扩展处理器已经支持INT8加速推理运算,也不能和通常意义上CPU的整数运算划等号。贸然押宝,错了当然怪不得别人。
不难看出,Bulldozer的模块化,与之前Intel Nehalem架构的模块化设计,只限于架构层面,并不是为制程考虑——CPU不论几个模块多少核,都是作为一个整体(die)来制造的,毕竟十年前制程还没到瓶颈。
然而,到了AMD以代号Naples的(第一代)EPYC处理器重返服务器市场的2017年,摩尔定律放缓的迹象已很明显。同样的14nm(可能还没有英特尔的先进)制程,AMD如何以更低的成本提供更多的核芯?
EPYC系列处理器基于AMD的Zen系列架构,从Zen、Zen+到Zen 2,以及规划中的Zen 3的发展路线,有点像前面提到的Tick-Tock:开发一个良好的基础然后交替演进,不断优化。
与先辈们不同,Zen系列的模块化明显侧重于解决制程面对的挑战,即芯片在物理上被切割为多个die(比较小的芯片更容易制造,良率有保证,有利于降低成本),通过Infinity Fabric(IF)互连为一个整体,所以每个die就是一个模块,但不一定是模块化设计的最小单位。
第一代EPYC处理器的4个die及Infinity Fabric示意
还是从初代EPYC处理器所采用的Zen架构说起。Zen确立了该系列计算单元模块化的最小单位CCX(Core Complex,核芯复合体),每个CCX包括4个Zen核芯(Core),以及8 MiB共享L3 Cache,每核芯2 MiB。
从AMD公开的示意图来看,各片(Slice)L3 Cache之间的连接方式像是full-mesh(全网状,即每两个点之间都有直接连接,无需跳转),CCX内部的跨核芯L3 Cache访问是一致的
Zen的CCD里除了2个CCX,还有2个DDR内存控制器(各对应1个内存通道),用于片上(die之间)互连的Infinity Fabric(IF On-Package,IFOP),而CPU之间互连的Infinity Fabric(IF Inter-Socket,IFIS)与对外的PCIe通道是复用的——这个知识点在后面会用到。
芯片层面的模块是CCD(Core Complex Die),包括2个CCX,共8个Core、4 MiB L2 Cache、16 MiB L3 Cache。官方名称为AMD EPYC 7001系列的第一代EPYC处理器只有CCD这一种(die层面的)模块,所以每个CCD除了2个CCX,还有大量I/O接口器件,包括DDR、Infinity Fabric/PCIe控制器,CCX占CCD面积的比例只比一半略多(56%)。
这个多芯片模块(multi-chip module,MCM)架构的代号为Zeppelin(齐柏林),四个这样的“复合型”CCD构成完整的第一代EPYC处理器,最多能提供32核芯、64 MiB L3 Cache,直接减少CCD的数量就会得到面向PC市场的高端(2×CCD)和主流产品(单CCD)。
按照AMD提供的数据:每个die的面积为213mm²(平方毫米),4个die的MCM封装总面积为852mm²,如果要用大型单一芯片来实现,面积可以缩小到777mm²,大约节省10%,但是制造和测试成本要提高约40%,完全32核的收益下降约17%、成本提高约70%。投入产出比当然非常划算,也变相的说出了大英的苦衷——可是,后者为什么还在坚持单片路线呢?
MCM这种完全对称的模块化方案,如果套用到数据中心领域,相当于一个园区,几栋建筑结构和功能完全一样,都包含了机房、变配电、柴发、冷站、办公和接待区域等。好处当然是彼此之间没有硬性依赖,每栋建筑都可以独立作为数据中心使用,照此复制就可成倍扩大规模;缺点是没有其他类型的建筑,而有些功能还是需要专门的建筑集中和分区管理的,譬如人员办公和统一接待……
如果一个数据中心园区只有黄框里这一种建筑(模块)……实际上,加上左边的66KV变电站,这里也只是整个园区的一角
况且,与绝大多数的数据中心园区不同,CPU对各模块之间的耦合度要求高得多,否则无法作为一个整体来运作,分工合作快速完成数据处理等任务。而这,正是MCM方案的局限性所在。
第一代EPYC的每个CCD都有“自己的”内存和I/O(主要是PCIe)通道,加上CCD之间的互连,每个CCD的外部I/O都很“重度”
多芯片(对称)设计、全“分布式”架构的特点是内存和I/O扩展能力与CCD数量同步,随着核芯数量的增加,内存和I/O的总“容量”(包括带宽)会增加,这当然是优点,但缺点也随之而来:
首先是局部性(locality)会降低I/O的性能,主要是跨CCD的内存访问时延(latency)明显上升。因为每组(2个)CCX都有自己的本地内存,如果要访问其他CCD上连接的内存,要额外花费很多时间,即所谓的NUMA(Non-Uniform Memory Access,非一致性内存访问)。虽然Zen的CCD上有足够多的IFOP,让4个CCD之间能组成全连接(full-mesh),无需经其他CCD跳转(类似于CCX内4个核芯之间的状况),但I/O路径毕竟变长了;如果要访问其他CPU(插槽)连接的内存,还要经过IFIS,时延会进一步上升。
CCD里的两个CCX也通过Infinity Fabric连接,同样会增加跨CCX的Cache访问时延
根据AMD提供的数据,不同内存访问的时延水平大致如下:
随着访问路径变长和复杂,时延以大约一半的比例增加,这个幅度还是很明显的。
同一个CCD里的内存访问没有明显差异,而跨CCD的内存访问,时延增加就很明显了
然后是PCIe,前面已经有图说明,Zen用于CPU之间互连的IFIS与PCIe通道是复用的,即单路(单CPU)的情况下全都用于PCIe通道,共有128个;双路(双CPU)的情况下每个CPU都要拿出一半来作为(两者之间的)IFIS,所以(对外的)PCIe通道数量仍然是128个,没有随着CPU数量的增加而增长。
简单归纳一下,Zen架构的问题是:核数越多,内存访问的一致性越差;CPU数量增加,外部I/O的扩展能力不变——NUMA引发的跨CPU访问时延增长问题还更严重。
单CPU就能提供128个PCIe 30通道原本是第一代EPYC处理器的一大优势,但双CPU仍然是这么多,就略显尴尬了
核数进一步增加的困难很大,不论是增加每个CCD的核数,还是增加CCD的数量,都要面临互连的复杂度问题,也会进一步恶化一致性。
说得更直白一些,就是Zen架构的扩展能力比较有限,难以支持更大的规模。
既然双路配置有利有弊,AMD又是时隔多年重返服务器市场,单路一度被认为是EPYC的突破口,譬如戴尔(Dell)在2018年初推出三款基于第一代EPYC的PowerEdge服务器,其中就有两款是单路。
1U的R6415和2U的R7415都是单路服务器
类似的情况在通常用不到那么多核及I/O扩展能力的PC市场体现得更为明显,在只需要一到两个CCD即可的情况下,消费者更多感受到的是低成本带来的高性价比,所以“AMD Yes!”的鼓噪主要来自个人用户,服务器市场在等待EPYC的进一步成熟。
只有1个die的Ryzen将Zen架构的缺点最小化,获得个人用户的喜爱也就不足为奇了
Chiplet:异构混合模块化的是与非
时隔两年之后,AMD推出基于Zen 2架构的第二代EPYC处理器,通过架构与制程一体优化,达到最高64核、256 MiB L3 Cache,分别是第一代EPYC的2倍和4倍,内存访问一致性和双路的扩展性也有不同程度的改善,终于获得了一众云服务提供商(CSP)的青睐。
Zen 2的整体设计思维是Zen的延续,但做了很多明显的改进,配合制程(部分)升级到7nm,突破了Zen和Zen+在规模扩展上的限制。
首先,Zen2架构延续了Zen/Zen+架构每个CCD有2个CCX、每个CCX有4个核芯共享L3 Cache的布局,但是每个核芯的L3 Cache增大一倍,来到4MiB,每个CCX有16 MiB L3 Cache,是Zen/Zen+架构的两倍。
CCD层面的主要变化是把DDR内存、对外的Infinity Fabric(IFOP/IFIS)和PCIe控制器等I/O器件剥离,以便于升级到7nm制程。AMD表示,第一代EPYC中,上述I/O器件占CCD芯片面积的比例达到44%,从制程提高到7nm中获益很小;而第二代EPYC的7nm CCD中,CPU和L3 Cache这些核心计算、存储器件的占比,高达86%,具有很好的经济性。
被从CCD中拿出来的DDR内存控制器、Infinity Fabric和PCIe控制器等I/O器件,组成了一个单独的I/O芯片,即I/O Die,简称IOD,仍然采用成熟的14nm工艺。
自左至右,分别是传统单片式、第一代EPYC的MCM、第二代EPYC的Chiplet三种架构的示意图
一个IOD居中,最多8个CCD围绕着它,AMD把这种做法称为Chiplet(小芯片)。
如果继续拿数据中心的模块化来强行类比,相当于把整个园区内的变电站、柴发、冷站、办公和接待区域都整合到一个建筑里,位于园区中央,周围是构造完全相同的一座座机房楼……你说,这样一个所有机房楼都离不开的建筑,该有多重要?
仅从布局看,和第二代EPYC处理器有点像的数据中心,但变电站在园区外,制冷也是分布式的(与4个机房模块在一起),中间的建筑并没有上面设想的那么重要
第一代EPYC处理器(Naples)与第二代EPYC处理器(Rome)的片上布局对比,后者是1个IOD + 8个CCD,共9个小芯片组成的混合多die设计
因为CCD的数量增加一倍,所以Rome的核数可以达到Naples的两倍;因为每个CCX/CPU核芯的L3 Cache容量也增加了一倍,所以Rome的L3 Cache总容量可以达到Naples的四倍。
14nm IOD + 7nm CCD的组合——因为不是全部升级到7nm,所以我更愿意称之为制程的“优化”——体现了更高的扩展性和灵活性,使第二代EPYC能够以较低的制造成本提供更丰富的产品组合,提高了市场竞争力。但是,事情并没有看起来这么简单,要了解产品的具体构成和预期的性能表现,您还需要继续往下看。
2019年8月,第二代EPYC正式发布后不久,AMD在Hot Chips大会上介绍了Zen 2产品的Chiplet设计。可能是之前有Zen+架构采用12nm制程的缘故吧,IOD的制程被写成了12nm,其他场合的官方材料都是14nm,所以我们还是以后者为准
今年2月IEEE的ISSCC(International Solid-State Circuits Conference,国际固态电路峰会)2020上,AMD更详细的介绍了Zen 2这一代产品的设计。结合前一幅图可以看到,第二代EPYC的IOD具有834亿晶体管,数量与同样采用14nm制程的英特尔Skylake/Cascade Lake相当——虽然两者的晶体管类型构成有很大差别,但可以作为一个参照,说明这个IOD自身的规模和复杂度。
从红框中的选项来看,EPYC 7302 CPU有4个CCD,每个CCX有2个核芯,可以选择各启用1个
IOD集中所有I/O器件的一个好处是,CPU能提供的内存通道数量与CCD的数量无关。E企实验室前一阵测试了基于第二代EPYC处理器的Dell PowerEdge R7525服务器,送测配置包括2个AMD EPYC 7302处理器,从PowerEdge R7525的BIOS设置中可以看到,这款16核的CPU有4个CCD(而不是8个),应该对应下图中右二的情形:
上方柱状图是AMD列出7+14nm Chiplet方案与假设的单片7nm方案相比,成本优势可以达到一半以上(64核没有假设,可能是指单片式很难制造);下方从左至右依次是8、6、4、2个CCD的布局,原则是尽可能的对称
虽然7302在EPYC 7002系列产品中定位偏低端,只有16个核芯,用4个CCX就能满足,但是它拥有128MiB的L3 Cache,这又需要8个CCX才可以。因此,7302的每个CCX只有2个核芯,享受原本属于4个核芯的16 MiB L3 Cache。
从EPYC 7002系列的配置表中可以看出,7302下面72开头的产品才是真正的低端,譬如同样是16核的7282,不仅L3 Cache容量只有7302的一半(倒是符合每核4 MiB的“标配”),而且仅支持4个内存通道,也是7302等产品的一半——说明其CCD数量是2个,就像前一幅图右下方所示的情况——4个内存通道配置的运行频率也低,只有DDR4-2667,与标准的8通道DDR4-3200相比,理论内存带宽仅为40%多
Dell PowerEdge R7525用户手册里对内存条的安装位置有很详细的说明,毕竟插满8个内存通道和只用4个内存通道,性能差距太大
IOD集中所有I/O对性能也有好处,因为内存控制器集中在一个芯片上,有助于降低内存访问的局部性(NUMA)。不过,AMD在很多场合放出的示意图很有误导性,容易让人以为,对Rome(下图右侧)来说,同一个CPU上的内存访问是不存在NUMA的。
从上面的数据来看,第二代EPYC处理器的“本地”内存访问时延有所增长,毕竟内存控制器和CCX不在一个die上了;收益是跨CPU内存访问的时延有所下降,总体更为平均
好在,稍微详细一点的架构示意图表明,一个EPYC 7002系列CPU内部的内存访问仍然会有“远近”之分:
Dell PowerEdge R7525的BIOS配置中,可以在L3 Cache的NUMA设置为Enabled之后,看到每个CPU内部其实还是可以像EPYC 7001系列一样,分成4个不同的NUMA区域
这时学术性会议的价值就体现出来。AMD在ISSCC 2020上的演讲表明,完整版的Server IOD要承载的功能太多,已经有太多的晶体管,中间都被Infinity Fabric和PCIe相关的I/O所占据,内存控制器只能两两一组布置在IOD的四角,每2个CCD就近共享2个内存控制器。由于中间已经没有走线空间,只能构成一个没有对角线连接的2D-mesh拓扑——仅从拓扑角度而论,还不如EPYC 7001系列4个CCD的full-mesh连接方式。所以,临近的访问有长短边造成的延迟差异,对角线的内存访问因为要走过一长一短两条边,没有捷径可走,自然要更慢一些。
注意放大看IOD布局示意图和右侧1~4的不同等级时延注解,可以理解为每个CPU内部仍然分为4个NUMA区域:本地、短边、长边、(拐个弯才能抵达的)对角线
Hot Chips大会上的这张示意图突出了不同功能的Infinity Fabric导致的IOD中部拥挤,和DDR内存控制器都被挤到边角上的感觉。结合前一张图,不难理解,像EPYC 7282这样只有2个CCD对角线布置的低端SKU,另一条对角线上的4个DDR内存控制器主要起增加内存容量的作用,不如只保留CCD就近的4个内存通道
总之,不管是EPYC 7001系列的MCM,还是EPYC 7002系列的Chiplet,随着芯片数量的增长,性能肯定会受到越来越明显的影响(而不是近乎线性的同步提升),只是好的架构会延缓总体性能增长的衰减速度。
这里我们可以回过头来看看同样基于Zen 2架构的第三代AMD Ryzen处理器,主流PC产品没有那么多核数要求,只用2个CCD即可满足,所以其配套的Client IOD(cIOD)正好是Server IOD的四分之一,从前面图中晶体管数量的对比(209亿 vs 834亿)也可以看出来。
代号“Matisse”的第三代Ryzen,仍然可以看到两个DDR4内存控制器偏居一隅的“遗存”,但对两个CCD已经公平了很多,基本不存在NUMA问题。也就难怪“AMD真香”党在消费类用户中比例要大得多
尽管CCD升级到了7nm,但更多核芯、更大得多的L3 Cache,意味着整体功耗的上升,譬如同样16核的7302和7282,前者Cache大一倍,频率略有提高,默认TDP就来到了155W,Dell为送测的R7525配备了180W的散热器——而EPYC 7282的TDP则“只有”120/150W。当然,CCD应用7nm的效果还是比较明显的,同样16核、L3 Cache只有7302四分之一,运行频率还低500MHz的7301,TDP也有150/170W,基本与7302相当。
为了满足云计算、高性能计算(HPC)和虚拟化等场景的用户需求,AMD又向EPYC 7002系列CPU中增加了大量多核大(L3) Cache以及核数虽少但频率很高的型号(如今年初发布的7Fx2系列),导致全系列产品中TDP在200W以上的SKU占比很高,也给服务器的散热设计带来了更高的挑战。
200W+的CPU将越来越常见
EPYC 7002系列的另一大改进是PCIe从30升级到40,单路仍然是128个通道,但双路可以支持多达160个通道(譬如Dell PowerEdge R7525的特定配置)——在主板支持的情况下。第一代EPYC处理器推出时的一个卖点是,为其设计的主板也可以支持第二代EPYC处理器。没有广而告之的是,要支持PCIe 40,主板需要重新设计。用老主板可以更快的把第二代EPYC处理器推向市场,却不能充分发挥新CPU的全部能力。
不过,PCIe 40本身就是一个很大的话题,留待以后(有机会的话)专文讨论。
如果说中央处理器(CPU)是整个电脑系统的大脑,那么芯片组将是整个身体的心脏。在电脑界称设计芯片组的厂家为Core Logic,Core的中文意义是核心或中心,光从字面的意义就足以看出其重要性。对于主板而言,芯片组几乎决定了这块主板的功能,进而影响到整个电脑系统性能的发挥,芯片组是主板的灵魂。芯片组性能的优劣,决定了主板性能的好坏与级别的高低。这是因为目前CPU的型号与种类繁多、功能特点不一,如果芯片组不能与CPU良好地协同工作,将严重地影响计算机的整体性能甚至不能正常工作。主板芯片组几乎决定着主板的全部功能,其中CPU的类型、主板的系统总线频率,内存类型、容量和性能,显卡插槽规格是由芯片组中的北桥芯片决定的;而扩展槽的种类与数量、扩展接口的类型和数量(如USB20/11,IEEE1394,串口,并口,笔记本的VGA输出接口)等,是由芯片组的南桥决定的。还有些芯片组由于纳入了3D加速显示(集成显示芯片)、AC’97声音解码等功能,还决定着计算机系统的显示性能和音频播放性能等。
Linux上MySQL优化提升性能,可以优化关闭NUMA特性如下:
这些其实都源于CPU最新的技术:节能模式。操作系统和CPU硬件配合,系统不繁忙的时候,为了节约电能和降低温度,它会将CPU降频。
为了保证MySQL能够充分利用CPU的资源,建议设置CPU为最大性能模式。这个设置可以在BIOS和操作系统中设置,当然,在BIOS中设置该选项更好,更彻底。
然后我们看看内存方面,我们有哪些可以优化的。
i)
我们先看看numa
非一致存储访问结构
(NUMA
:
Non-Uniform
Memory
Access)
也是最新的内存管理技术。它和对称多处理器结构
(SMP
:
Symmetric
Multi-Processor)
是对应的。
我们可以直观的看到:SMP访问内存的都是代价都是一样的;但是在NUMA架构下,本地内存的访问和非
本地内存的访问代价是不一样的。对应的根据这个特性,操作系统上,我们可以设置进程的内存分配方式。目前支持的方式包括:
--interleave=nodes
--membind=nodes
--cpunodebind=nodes
--physcpubind=cpus
--localalloc
--preferred=node
简而言之,就是说,你可以指定内存在本地分配,在某几个CPU节点分配或者轮询分配。除非
是设置为--interleave=nodes轮询分配方式,即内存可以在任意NUMA节点上分配这种方式以外。其他的方式就算其他NUMA节点上还有内
存剩余,Linux也不会把剩余的内存分配给这个进程,而是采用SWAP的方式来获得内存。
所以最简单的方法,还是关闭掉这个特性。
关闭特性的方法,分别有:可以从BIOS,操作系统,启动进程时临时关闭这个特性。
a)
由于各种BIOS类型的区别,如何关闭NUMA千差万别,我们这里就不具体展示怎么设置了。
b)
在操作系统中关闭,可以直接在/etc/grubconf的kernel行最后添加numa=off,如下所示:
kernel
/vmlinuz-2632-220el6x86_64
ro
root=/dev/mapper/VolGroup-root
rd_NO_LUKSUTF-8
rd_LVM_LV=VolGroup/root
rd_NO_MD
quiet
SYSFONT=latarcyrheb-sun16
rhgb
crashkernel=auto
rd_LVM_LV=VolGroup/swap
rhgb
crashkernel=auto
quiet
KEYBOARDTYPE=pc
KEYTABLE=us
rd_NO_DM
numa=off
另外可以设置
vmzone_reclaim_mode=0尽量回收内存。
c)
启动MySQL的时候,关闭NUMA特性:
numactl
--interleave=all
mysqld
当然,最好的方式是在BIOS中关闭。
ii)
我们再看看vmswappiness。
vmswappiness是操作系统控制物理内存交换出去的策略。它允许的值是一个百分比的值,最小为0,最大运行100,该值默认为60。vmswappiness设置为0表示尽量少swap,100表示尽量将inactive的内存页交换出去。
具体的说:当内存基本用满的时候,系统会根据这个参数来判断是把内存中很少用到的inactive
内存交换出去,还是释放数据的cache。
接口类型,是根据内存条金手指上导电触片的数量来划分的。金手指上的导电触片,也习惯称为针脚数(Pin)。因为不同的内存采用的接口类型各不相同,而每种接口类型所采用的针脚数各不相同。下面就让我带你去看看关于内存条的基础知识吧,希望能帮助到大家!
内存知识 详解:接口类型
1、金手指
金手指(connecting finger)是内存条上与内存插槽之间的连接部件,所有的信号都是通过金手指进行传送的。金手指由众多金**的导电触片组成,因其表面镀金而且导电触片排列如手指状,所以称为“金手指”。金手指实际上是在覆铜板上通过特殊工艺再覆上一层金,因为金的抗氧化性极强,而且传导性也很强。不过,因为金昂贵的价格,目前较多的内存都采用镀锡来代替。从上个世纪 90 年代开始,锡材料就开始普及,目前主板、内存和显卡等设备的“金手指”,几乎都是采用的锡材料,只有部分高性能服务器/工作站的配件接触点,才会继续采用镀金的做法,价格自然不菲。
内存的金手指
内存处理单元的所有数据流、电子流,正是通过金手指与内存插槽的接触与 PC 系统进行交换,是内存的输出输入端口。因此,其制作工艺,对于内存连接显得相当重要。
2、内存插槽
最初的计算机系统,通过单独的芯片安装内存,那时内存芯片都采用 DIP(Dual ln-line Package,双列直插式封装)封装,DIP 芯片是通过安装在插在总线插槽里的内存卡与系统连接,此时还没有正式的内存插槽。DIP 芯片有个最大的问题,就在于安装起来很麻烦,而且随着时间的增加,由于系统温度的反复变化,它会逐渐从插槽里偏移出来。随着每日频繁的计算机启动和关闭,芯片不断被加热和冷却,慢慢地芯片会偏离出插槽。最终导致接触不好,产生内存错误。
内存插槽
早期还有另外一种 方法 ,是把内存芯片直接焊接在主板或扩展卡里,这样有效避免了 DIP 芯片偏离的问题,但无法再对内存容量进行扩展,而且如果一个芯片发生损坏,整个系统都将不能使用,只能重新焊接一个芯片或更换包含坏芯片的主板。此种方法付出的代价较大,也极为不便。
对于内存存储器,大多数现代的系统,都已采用单列直插内存模块(Single Inline Memory Module,SIMM)或双列直插内存模块(Dual Inline Memory Module,DIMM)来替代单个内存芯片。这些小板卡插入到主板或内存卡上的特殊连接器里。
3、内存模块
1) SIMM
SIMM(Single Inline Memory Module,单列直插内存模块)。内存条通过金手指与主板连接,内存条正反两面都带有金手指。金手指可以在两面提供不同的信号,也可以提供相同的信号。SIMM 就是一种两侧金手指都提供相同信号的内存结构,它多用于早期的 FPM 和 EDD DRAM,最初一次只能传输 8bif 数据,后来逐渐发展出 16bit、32bit 的 SIMM 模组。其中,8bit 和 16bit SIMM 使用 30pin 接口,32bit 的则使用72pin 接口。在内存发展进入 SDRAM 时代后,SIMM 逐渐被 DIMM 技术取代。
2) DIMM
DIMM(Dual Inline Memory Module,双列直插内存模块)。与 SIMM 相当类似,不同的只是 DIMM 的金手指两端,不像 SIMM 那样是互通的,它们各自独立传输信号。因此,可以满足更多数据信号的传送需要。同样采用 DIMM,SDRAM 的接口与 DDR 内存的接口也略有不同,SDRAMDIMM 为 168Pin DIMM 结构,金手指每面为 84Pin,金手指上有两个卡口,用来避免插入插槽时,错误将内存反向插入而导致烧毁;
DDR DIMM则采用 184Pin DIMM 结构,金手指每面有 92Pin,金手指上只有一个卡口。卡口数量的不同,是二者最为明显的区别。DDR2 DIMM 为240pinDIMM 结构,金手指每面有 120Pin,与 DDR DIMM 一样金手指一样,也只有一个卡口,但是卡口的位置与 DDR DIMM 稍微有一些不同。因此,DDR 内存是插不进 DDR2 DIMM 的,同理 DDR2 内存也是插不进 DDR DIMM 的。因此,在一些同时具有 DDR DIMM 和 DDR2 DIMM 的主板上,不会出现将内存插错插槽的问题。
不同针脚 DIMM 接口对比。为了满足 笔记本 电脑对内存尺寸的要求,SO-DIMM(Small Outline DIMM Module)也开发了出来,它的尺寸比标准的 DIMM 要小很多,而且引脚数也不相同。同样 SO-DIMM 也根据 SDRAM 和 DDR 内存规格不同而不同。SDRAM 的 SO-DIMM 只有 144pin引脚,而DDR 的 SO-DIMM 拥有 200pin 引脚。此外,笔记本内存还有 MicroDIMM 和 Mini Registered DIMM 两种接口。MicroDIMM 接口的DDR 为 172pin,DDR2 为 214pin;Mini Registered DIMM 接口为 244pin,主要用于 DDR2 内存。
3) RIMM
RIMM(Rambus Inline Memory Module)是 Rambus 公司生产的 RDRAM 内存所采用的接口类型。RIMM 内存与 DIMM 的外型尺寸差不多,金手指同样也是双面的。RIMM 有也 184 Pin 的针脚,在金手指的中间部分有两个靠的很近的卡口。RIMM 非 ECC 版有 16 位数据宽度,ECC 版则都是 18 位宽。由于 RDRAM 内存较高的价格,此类内存在 DIY 市场很少见到,RIMM 接口也就难得一见了。
基础知识(入门篇)
关于01
我们初学编程时,只知道编写代码,运行程序,却不知道程序是在什么的基础上运行的。只知道声明变量,给变量赋值,数据存储在变量中,却不知道变量是以什么形式存在。
《内存》可以参考《计算机组成原理》和《微机原理》书籍,而作为信息学奥赛的同学们,只需了解《内存》的一些基础知识即可,不必深究。
关于《计算机组成原理》,可参考 文章 :
计算机组成原理(入门篇)
目录02
1、内存的内部结构
2、数据是如何存储在内存中
3、数据在内存中的表现形式
4、存储单元的大小
5、如何从内存中寻找指定的数据(内存地址)
概要03
本篇主要讲解有关《内存》的基础知识,有助于自己在编程上的进一步提升。
为什么学习《内存》的知识可以提升自己对编程进一步的认识呢
其实,我们学习信奥(C/C++)时,一般只是学习C/C++的相关语法。当我们练习多了,可以熟练地运用各种语法。我们也知道如何将1+1赋给一个int类型变量,也知道不能把整数1赋给string类型变量(对象)。但是1+1赋值操作在内存中是如何实现的呢为什么浮点型存在误差为什么int类型与string类型不能直接赋值操作
我们只知道编写的程序在内存中运行,却不知道数据在内存中是如何存储的。就好比只看到书籍的封面,但不知道书中的内容。
要求04
在学习《内存》之前,我们只需掌握C/C++一些基础知识,可以独立解决一些简单的问题即可。
内存的内部结构
对于信息学奥赛的同学们来说,《内存》这一概念比较抽象。不过,经过阅读文章《计算机组成原理(入门篇)》后,相信同学们对内存的概念清晰了不少,至少知道内存是用来存储程序运行的相关数据。
常用数据一般存储在硬盘中,如果对这些数据进行处理(例如使用Word写一篇文章),并不是CPU直接对硬盘的文件进行操作,而是从硬盘相对应的位置把该文件的数据读取到内存中,CPU再对内存中的数据进行处理。简单地说,《内存》是CPU与硬盘进行沟通的“桥梁”。当然,并不一定是硬盘,平时存储数据的设备还有U盘等,统称为外存。
《内存》内部由数以亿计的纳米级电子元件构成。
如上图,内存条由存储芯片、金手指、电路组成。
存储芯片:黑色的方块。每个方块由很多的晶体管组成,可以理解为数据就存储在晶体管中。
金手指:底部的金色金属片。内存条插在主板的内存条插槽中,实际上与插槽接触的部位就是金手指。如此一来,CPU就可以通过主板与内存进行通信。
电路:绿色面板。面板中有许多细微的线路和电阻等电子元件,用于数据的传输。
数据是如何存储在内存中
家里控制电灯的开关,电脑的开关。存储芯片中的晶体管也是如此。程序运行的数据存储在晶体管中。
如上图,每个方格代表一个晶体管。
如下图,每个晶体管都有独立的开关,通电时开,断电时关。此处用白色表示开,黑色表示关。
一个数值并不是只存储在一个晶体管中,是多个晶体管。而多个晶体管构成一个存储单元。
存储单元的大小
存储单元有大小,而一个存储单元的大小是8位(bit)。
内存中常用的存储单位是:位(bit)、字节(Byte)。
1字节=8位
那么一个存储单元也是1字节。
关于《存储单位》的相关知识,会以一篇独立的文章详细讲解。
数据在内存中的表现形式
数据在内存中是以二进制的形式存储。
十进制是由0~9组成,而二进制是由0和1组成。
如上图,这是一个存储单元(8bit),有8个格子,一个格子表示1bit。而每一个格子的值要么0,要么为1。其中,白色表示开,黑色表示关,一般用1和0分别表示开和关。那么用二进制表示是01101001,转换为十进制的值是105,所以该存储单元存储的值就是105。
关于《进制》的相关知识,会以一篇独立的文章详细讲解。
此处只讲解数字数据,其他数据的表现形式很复杂。
如何从内存中寻找指定的数据(内存地址)
先举个例子:
如上图,有几栋楼房,我们都知道,每一栋楼都有一个具体的地址,而一栋楼的每家每户都有各自的房号,从而组成一个完整的地址。而我们的个人居民身份证就有一个详细地址。
居民身份证除了有地址外,还有身份证号码,每一个号码都是唯一。
如何从内存中寻找指定的数据
内存中的存储单元就像人一样,都有着独一无二的“身份证号码”,就是地址。比如警察叔叔根据身份证号码就能查到对应的个人信息。
再举个例子:
如上图,这是一个书柜,又分成若干个小柜子,现对每个小柜子进行分类放置书籍并设置标签。我们要寻找某一本书时,根据标签就可以轻松找到。程序运行时也是一样,知道要在什么地址进行数据的读写操作。
其他疑问
为什么要分十进制而二进制
简单说,十进制是给人用的,而二进制是给机器用的。
数据有数字、字母、符号、声音、图像等等。数据是以二进制的形式存储在内存中。
内存数据输出到 显示器 时,为什么可以显示我们人类能看懂的信息
内存中的数据是经过转换处理后,我们才能看懂。我们所看到的数据(例如一篇文章、一张照片、一部**),它们的本质还是二进制。
你不知道的内存知识
一、CPU与内存
先铺垫几个概念,以免后面混乱:
Socket或Processor: 指一个物理CPU芯片,盒装还是散装的。上面有很多针脚,直接安装在主板上。
Core : 指在Processor里封装一个CPU核心,每个Core都是完全独立的计算单元,我们平时说的4核心CPU,指的就是Processor里面封装了4个Core。
HT超线程:目前Intel与AMD的Processor大多支持在一个Core里并行执行两个线程,此时从 操作系统 看就相当于两个逻辑CPU(Logical Processor)。大多数情况下,我们程序里提到的CPU概念就是指的这个Logical Processor。
咱们先来看几个问题:
1、CPU可以直接操作内存吗
可能一大部分老铁肯定会说:肯定的啊,不能操作内存怎么读取数据呢。
其实如果我们用这聪明的大脑想一想,咱们的台式主机大家肯定都玩过。上面CPU和内存条是两个完全独立的硬件啊,而且CPU也没有任何直接插槽用于挂载内存条的。
也就是说,CPU和内存条是物理隔离的,CPU并不能直接的访问内存条,而是需要借助主板上的其他硬件间接的来实现访问。
2、CPU的运算速度和内存条的访问速度差距有多大
呵呵呵,这么说吧,就是一个鸿沟啊,CPU的运算速度与内存访问速度之间的差距是100倍。
而由于CPU与内存之间的速度差存在N个数量级的巨大鸿沟,于是CPU最亲密的小伙伴Cache 闪亮登场了。与DRAM 家族的内存(Memory)不同,Cache来自SRAM家族。
而DRAM与SRAM的最简单区别就是后者特别快,容量特别小,电路结构非常复杂,造价特别高。
而Cache与主内存之间的巨大性能差距主要还是工作原理与结构不同:
DRAM存储一位数据只需要一个电容加一个晶体管,SRAM则需要6个晶体管。
由于DRAM的数据其实是被保存在电容里的,所以每次读写过程中的充放电环节也导致了DRAM读写数据有一个延时的问题,这个延时通常为十几到几十ns。
内存可以被看作一个二维数组,每个存储单元都有其行地址和列地址。
由于SRAM的容量很小,所以存储单元的地址(行与列)比较短,可以被一次性传输到SRAM中。DRAM则需要分别传送行与列的地址。
SRAM的频率基本与CPU的频率保持一致,而DRAM的频率直到DDR4以后才开始接近CPU的频率。
3、Cache 是怎么使用的
其实Cache 是被集成到CPU内部的一个存储单元(平时也被我们称为高速缓存),由于其造价昂贵,并且存储容量远远不能满足CPU大量、高速存取的需求。
所以出于对成本的控制,在现实中往往采用金字塔形的多级Cache体系来实现最佳缓存效果。
于是出现了,一级Cache(L1 Cache)、二级Cache(L2 Cache)及三级Cache(L3 Cache)。每一级都牺牲了部分性能指标来换取更大的容量,目的也是存储更多的 热点 数据。
以Intel家族Intel SandyBridge架构的CPU为例:
L1 Cache容量为64KB,访问速度为1ns左右
L2Cache容量扩大4倍,达到256KB,访问速度则降低到3ns左右
L3 Cache的容量则扩大512倍,达到32MB,访问速度也下降到12ns左右(也比访问主存的105ns(40ns+65ns)快一个数量级)
L3 Cache是被一个Socket上的所有CPU Core共享的,其实最早的L3 Cache被应用在AMD发布的K6-III处理器上,当时的L3 Cache受限于制造工艺,并没有被集成到CPU内部,而是被集成在主板上,如图:
从上图我们也能看出来,CPU如果要访问内存中的数据,则需要经过L1、L2、L3三道关卡,就是这三个Cache中都没有需要的数据,才会从主内存中直接进行读取。
最后我们来看下Intel Sandy Bridge CPU的架构图:
二、多核CPU与内存共享的问题
问题:Cache一致性问题
多核CPU共享内存的问题也被称为Cache一致性问题。
其实就是多个CPU核心看到的Cache数据应该是一致的,在某个数据被某个CPU写入自己的Cache(L1 Cache)以后,其他CPU都应该能看到相同的Cache数据。
如果在自己的Cache中有旧数据,则抛弃旧数据。
考虑到每个CPU都有自己内部独占的Cache,所以这个问题与分布式Cache保持同步的问题是同一类问题
目前业界公认的解决一致性问题的最佳方案就是Intel 的MESI协议了,大多数SMP架构都采用了这一方案。
解决方案:MESI
不知道大家还记得Cache Line 吗,就是我们常说的高速缓存中缓存条目里面的那个缓存行。
其实仔细想想,在进行I/O操作从来不以字节为单位,而是以块为单位,有两个原因:
I/O 操作比较慢,所以读一个字节与读连续N个字节的花费时间基本相同
数据访问一般都具有空间连续的特征
所以CPU针对Memory的读写也采用了类似于I/O块的方式
实际上,CPU Cache(高速缓存)里最小的存储单元就是Cache line(缓存行),Intel CPU 的一个Cache Line存储64个字节。
每一级Cache都被划分为很多组Cache Line,典型的情况就是4条Cache Line为一组。
当Cache从Memory中加载数据时,一次加载一条Cache Line的数据
如图我们可以看到,每个Cache Line 头部都有两个Bit来标识自身状态,总共四种:
M(Modified):修改状态,在其他CPU上没有数据的副本,并且在本CPU上被修改过,与存储器中的数据不一致,最终必然会引发系统总线的写指令,将Cache Line中的数据写回Memory中。
E(E__clusive):独占状态,表示当前Cache Line中的数据与Memory中的数据一致,此外,在其他CPU上没有数据的副本。
S(Shared):共享状态,表示Cache Line中的数据与Memory中的数据一致,而且当前CPU至少在其他某个CPU中有副本。
I(Invalid):无效状态,在当前Cache Line中没有有效数据或者该Cache Line数据已经失效,不能再用;当Cache要加载新数据时,优先选择此状态的Cache Line,此外,Cache Line的初始状态也是I状态
在对Cache(高速缓存)的读写操作引发了Cache Line(缓存行)的状态变化,因而可以将其理解为一种状态机模型。
但MESI的复杂和独特之处在于状态有两种视角:
一种是当前读写操作(Local Read/Write)所在CPU看到的自身的Cache Line状态及其他CPU上对应的Cache Line状态
另一种是一个CPU上的Cache Line状态的变迁会导致其他CPU上对应的Cache Line状态变迁。
如下所示为MESI协议的状态转换图:
具体MESI的实现过程可以看我另一篇文章:看懂这篇,才能说了解并发底层技术
深入理解不一致性内存
MESI协议解决了多核CPU下的Cache一致性问题,因而成为SMP架构的唯一选择,而SMP架构近几年迅速在PC领域(__86)发展。
SMP架构是一种平行的架构,所有CPU Core都被连接到一个内存总线上,它们平等访问内存,同时整个内存是统一结构、统一寻址的。
如下所示给出了SMP架构的示意图:
随着CPU核心数量的不断增加,SMP架构也暴露出天生的短板,其根本瓶颈是共享内存总线的带宽无法满足CPU数量的增加,同时,在一条“马路”上通行的“车”多了,难免会陷入“拥堵模式”。
不知道你是否听说过总线风暴,可以看下:总线风暴
在这种情况下,分布式解决方案应运而生,系统的内存与CPU进行分割并捆绑在一起,形成多个独立的子系统,这些子系统之间高速互联,这就是NUMA(None Uniform Memory Architecture)架构,如下图所示。
可以看出,NUMA架构中的内存被分割为独立的几块,被不同CPU私有化了。
因此在CPU访问自家内存的时候会非常快,在访问其他CPU控制的内存数据时,则需要通过内部互联通道访问。
NUMA架构的优点就是其伸缩性,就算扩展到几百个CPU也不会导致性严重的下降。
NUMA技术的特点
在NUMA架构中引入了一个重要的新名词——Node
一个Node由一个或者多个Socket Socket组成,即物理上的一个或多个CPU芯片组成一个逻辑上的Node
我们来看一个Dell PowerEdge系列服务器的NUMA的架构图:
从上图可以看出其特点:
4个处理器形成4个独立的NUMA Node由于每个Node都为8 Core,支持双线程
每个Node里的Logic CPU数量都为16个,占每个Node分配系统总内存的1/4
每个Node之间都通过Intel QPI(QuickPath Interconnect)技术形成了点到点的全互联处理器系统
NUMA这种基于点到点的全互联处理器系统与传统的基于共享总线的处理器系统的SMP还是有巨大差异的。
在这种情况下无法通过嗅探总线的方式来实现Cache一致性,因此为了实现NUMA架构下的Cache一致性,Intel引入了MESI协议的一个扩展协议——MESIF
针对NUMA的支持
NUMA架构打破了传统的“全局内存”概念,目前还没有任意一种编程语言从内存模型上支持它,当前也很难开发适应NUMA的软件。
Java在支持NUMA的系统里,可以开启基于NUMA的内存分配方案,使得当前线程所需的内存从对应的Node上分配,从而大大加快对象的创建过程
在大数据领域,NUMA系统正发挥着越来越强大的作用,SAP的高端大数据系统HANA被SGI在其UV NUMA Systems上实现了良好的水平扩展
在云计算与虚拟化方面,OpenStack与VMware已经支持基于NUMA技术的虚机分配能力,使得不同的虚机运行在不同的Core上,同时虚机的内存不会跨越多个NUMA Node
采用的是intel itanium的cpu,CC-NUMA是CPU架构。
浪潮天梭K1系统是国家863计划重大专项“高端容错计算机研制与应用推广”项目成果。
第一台关键应用主机浪潮天梭K1系统的正式上市,标志着中国成为继美日之后全球第三个掌握新一代主机技术的国家,并有望改变祖国在金融、电信等核心领域大型主机长期依赖进口的尴尬局面。
浪潮天梭K1系统的上市,打破了信息化网络核心装备受制于人的局面,标志着中国信息化建设自主可控战略完成了关键布局,不仅填补了国内高端服务器市场的空白,大大降低了国内用户的成本。
0条评论