如果你曾经和服务器厂商打过交道,就会发现他们对于内存容量的渴求是极其贪婪的。是啊,电信、证券、量化这些不差钱的主顾在尝试了内存数据库百倍速度的高潮后,已经不能够回头了。毕竟0.01秒的响应提升,就意味着白花花的银子。当这个压力传导给提供机器的服务器厂商的时候,他们的内心一定是甜蜜又伴随着一丝酸楚的。24tb这个数字,框定了利润的上限,这是更多的金钱所不能突破的。
这带来一个根本性的问题,单机服务器最大内存的极限是怎么确定的?它的制约因素有哪些?为了简化讨论范围,我们限定在占据服务器市场98%以上的x86服务器,并假设不受成本的约束。我们从cpu内核和操作系统、以及存储子系统两方面来寻找答案。
cpu内核和操作系统
操作系统和cpu内核都支持64位地址空间,它能够访问的地址空间是
2^64=16384 pb
好大的空间,似乎永远也用不完。是不是这个是内存容量的极限呢?实际上即使在cpu内核中还有一个因子,限制了cpu和操作系统的寻址空间,那就是bitwidth。它决定了页表转换的地址长度,它现在最大是48位(我印象里),它可以从寄存器里面读出来,越新和服务器cpu,这个值越大。那么新的地址空间最大是多少呢?
2^48=256 tb
256tb,小了不少,是不是这就是内存容量的极限了呢?实际上并不是。
内存子系统
现代计算机系统的内存都由cpu内置的内存控制器来管理,为了寻找内存的极限,我们把目光投入到志强中的战斗机,e7服务器上。e7面向对高可靠性和高可扩展性需求强烈的用户,当然价格也十分感人。高可靠性说的是ras,高可扩展性是说可以扩展为4路,8路,甚至16路服务器。所谓n路,通俗的说就是有n个物理cpu。
16路服务器十分十分罕见,部分原因在于从8路扩展为16路后,保证cache一致性所发的snoop包会降低性能,在某些情况下得不偿失。我们这里就略过。8路服务器作为主流最高端服务器,它的内存最大能够达到多少呢?
我们先来看一下它的内存子系统:
e7 cpu后面并不直接插内存条dimm,这点和e5不一样。内存条插在一个叫做smb(scalable memory buffer)的芯片后面。每个smb支持两个channel,每个channel后面可以插3根dimm(图里是两个,实际可插三个)。smb和cpu直接通过一种叫做smi link(scalable memory interconnect)的总线连接,一个cpu可以连接四个smb。
框图不够生动,我们来看个实际的例子:
这个板子叫做memory riser,红框的部分就是smb,有两个。蓝框的部分是内存插槽。大家数一下,可以看到一个smb后面可以插6根dimm,分别属于两个channel。一个照的比较好的:
来源:dell e7服务器宣传照
有的同学要问了,不是说好每个cpu后面接4个smb吗?怎么才两个?别着急,因为每个cpu后面可以接两个memory riser:
4路e7服务器,可以插8个memory riser
插满8个memory riser
好了,我们可以计算一下了,8路可以插16个memory riser,每个memory riser可以插12个dimm:
16 x 12 = 192根
共可以插192根dimm。现在焦点落在单根dimm的容量上了。lrdimm往往可以支持更大的内存容量(原理我以后再讲),目前据我所知,最大的lrdimm容量是128gb。所以8路最大内存容量为:
192 x 128 = 24576 gb = 24 tb
现在你知道前面的24 tb哪里来的了吧!
结论
服务器最大支持的内存数量不在于是64位还是bitwidth,而在于能够插多少内存条。如果是16路e7,最大内存可以达到48tb。e5系列内存相比e7就差一大截了。
dimm形式封装的傲腾内存在不远的将来也许会打破这种限制,傲腾dimm内存可以达到2t以上每根,到那时也许bitwidth必须要加宽了。钱多的主顾纷纷表示,真香!