本文转载自微信公众号 “五原路287点4弄”,原文链接https://mp.weixin.qq.com/s/Jc5SMDxMUNhdxW60eWINKA。
在“千年虫”之前,
那些追求“服务永不下线”的方案,比如数据库,是这样的。
A、B两
台主机, 通过SCSI线缆连接至共享的一台磁盘阵列,运行比如NCR lifekeeper这样的软件向客户端呈现一个虚拟的
IP
漂移地
址以接入对数据库乃至阵列的读和写请求。初始时A主机处于active状态, 所有客户的读写请求都物理上由它代为访问阵列柜来完成。B主机处于standby状态, 主要负责提供情绪价值。假使B主机在预设的时间段内没有收到预设数量的来自A主机的心跳信号,就判断A失效了,B主机便转为active状态,收发客户端的读写请求,并代为访问阵列柜 。 从客户角度看,那个漂移IP地址似乎从未下线过。而那台共享的磁盘阵列本身尽量硬件冗余, 反正可以卖得贵一点的: 双控,双通道SCSI盘并配置RAID,双外部SCSI卡(当年IBM, NCR采用企业级Microchannel 总线 )。这样便得以抵抗名叫“服务中断”这个丧彪了。 当时双机热备份的方案百花齐放,越做越好,A-B切换的时间也越做越短......
后来,星转斗移,发生了很多事情。业界出现了非常优秀的hypervisor, 硬件的虚拟化性能爆发, 以太网,3GIO (还记得这个PCIe最早的名字吗), RDMA, 纠删码,加上单台服务器价钱大幅下滑,
服务器部署规模惊人,大家对付“服务中断”这个丧彪越来越轻松 ,A+B HA的方案渐渐不再为人称道了.....
这些后话将来再说。
双机备份的存储方案没有消失。双机热备份的方案其实也在悄悄地进步。超微的一款storage superserver就是当下的一个范例。
这是一款基于X13SEB-TF主板和CSE-229TS-R000NP机箱的双节点系统。定位为High Availability Storage,NVMe Over Fabrics Solution 和Artificial Intelligence (AI), 包含了Dedicated 1GbE Private Ethernet connection for node-to-node communication (Heartbeat)和24 Hot-swap Dual Port Gen 5 U.2 NVMe SSD bays.
以下是其X13SEB-TF主板和CSE-229TS-R000NP机箱中板的逻辑图。
右上方紫色框里高亮出了
NTB技术和双端口NVMe盘
是该双节点的物理冗余的实现的基础。单从物理冗余角度看, PEX89104这款PCIe switch是主角。
1)其提供了2x16的PCIe上游通道去CPU集成的Root Complex;
2)其提供了2x8的PCIe通道的NTB,通过机箱中板,用来对接其对等的那个节点;
3)其提供了48的PCIe下游通道,连去中板乃至机箱的存储背板, 支持24片双端口NVMe 盘。
双节点连在一起是这样的。(为了方便描述,南端仅显示了1片双端口NVMe 盘。)
就让2025年,从NTB开始。
多年来,开发人员一直在使用PCI、PCI-X和PCIe互连技术的非透明桥接来设计多主机系统和智能I/O方案。非透明桥接(non-transparent bridging :NTB)功能实现了两个主机或内存域的隔离,同时允许两台主机或子系统之间的状态和数据交换。
透明桥NTB的工作原理
透明桥在多条PCI总线之间提供电气隔离。主机通过探索发现PCI桥和终端设备来枚举系统。对于透明网桥(TB),带有“Type 1”标头的配置状态寄存器(Configuration Status Register:CSR)通知处理器越过该PCI桥继续枚举其下游的其他设备(如图1中的PCI桥A、B和C所示。)。
这些带有 Type 1 头的桥接器包含用于主总线号、次总线号和从属总线号的CSR,当主机对CSR进行编程时,会定义所有下游设备的CSR地址。
通常,这是基于系统的总线架构和设备的连接拓扑来实现的。主机根据总线编号等信息,按照一定的地址分配规则,为每个下游设备的
CSR
分配特定的地址,从而构建起系统的地址映射关系,确保数据传输和设备控制的准确性和高效性。
端点设备的CSR中有一个“Type 0”标头,用于通知枚举器(BIOS或处理器)下游没有其他设备了。这些CSR包括用于向主机请求内存和I/O孔的基址寄存器(BAR)。
*PCI bus number
的分配
非透明桥NTB的工作原理
NTB提供处理器域分区,并在这些域的内存映射空间之间进行地址转换。这样一来,NTB在电气隔离上添加了逻辑隔离。 使用NTB,网桥任一侧的设备(比如PCIe gen5 的SSD) 从另一侧都不可见,但为处理器域之间的数据传输和状态交换提供了一条路径。
在上图这个例子中,系统主机将通过图2左侧分支上的网桥A和B(都是透明的)进行枚举,直到到达端点X。在右侧分支上,主机将在网桥D(NTB-D)停止枚举。同样,图右下角的本地CPU将通过网桥E和F(均为交换机内的虚拟网桥)枚举并发现端点Y,但不会尝试发现网桥D之外的元素。这就导致形成了两个内存域。
地址转换
在NTB环境中,PCI
Express系统需要将地址从一个内存空间转换到另一个内存空间。每个NTB端口有两组BAR,一组用于主级侧,另一组用于次级侧。BAR用于将地址转换窗口(address
translating windows)定义为NTB另一侧的内存空间,并允许将事务映射到本地内存或I/O。
*NTB中,地址转换窗口(address translating windows)是一种关键机制,用于实现不同 PCIe 域之间的地址映射和数据通信。
地址转换窗口是 NTB 中用于定义一个地址范围的逻辑区域,这个区域建立了源地址空间和目标地址空间之间的映射关系。通过地址转换窗口,系统能够将一个 PCIe 域(源域)中的地址转换为另一个 PCIe 域(目标域)中的对应地址,从而实现两个域之间的数据传输。
不同 PCIe 域可能使用不同的地址空间,地址转换窗口提供了一种方式,将源域的地址映射到目标域的地址,使得设备能够正确地访问另一个域中的资源。
地址转换窗口限定了哪些地址范围的数据可以在两个 PCIe 域之间进行传输,只有落在地址转换窗口所定义地址范围内的事务才会被允许通过 NTB 进行跨域传输,增强了数据传输的可控性和安全性。
在系统初始化时,软件会对 NTB 进行配置,为地址转换窗口设置源地址范围和对应的目标地址范围,以及其他相关的属性(如访问权限等)。这个过程就像创建了一张地址映射表,记录了源地址和目标地址之间的对应关系。
当一个 PCIe 设备发起一个跨域的事务请求时,NTB 会检查该请求的地址是否落在某个已配置的地址转换窗口的源地址范围内。如果是,NTB 会根据预先建立的映射关系,将源地址转换为目标地址,并将事务转发到目标 PCIe 域中的相应设备。
通常通过读写 NTB 的特定配置寄存器来设置地址转换窗口的参数,包括源地址起始值、源地址范围大小、目标地址起始值等。这些寄存器可以由操作系统或设备驱动程序进行访问和配置。
假设在一个包含两个 PCIe 域(域 A 和域 B)的系统中,域 A 中的设备想要访问域 B 中的内存资源。通过配置 NTB 的地址转换窗口,将域 A 中地址范围为
0x1000 - 0x1FFF
的地址映射到域 B 中地址范围为
0x2000 - 0x2FFF
的地址。当域 A 中的设备发起一个对地址
0x1500
的访问请求时,NTB 会将该地址转换为
0x2500
,并将请求转发到域 B 中对应的内存位置。
每个BAR都有一个设置寄存器,用于定义窗口的大小和类型,还有一个地址转换寄存器。虽然透明网桥根据总线号转发所有CSR,但NTB设备只接受发给自己的CSR事务。有两种转换技术:分别基于直接地址转换(Direct Address Translation)和查找表转换(lookup-table-basedTranslation)。
直接地址转换Direct Address Translation:
在直接地址转换中,所有事务的地址转换方式是,在事务终结所在的
BAR 的基地址上加上一个偏移量。也就是说,通过这种方式把事务的原始地址转换为设备实际可处理的地址。BAR中的基本翻译寄存器Base
translation registers用于设置这些翻译。图3说明了从主级侧地址映射到次级地址映射的这种转变。
*
“这个事务在该 BAR 中终结” 的含义
事务是指一次完整的数据传输操作,比如一次内存读写操作、I/O 操作等。它包含发起方(请求者)和目标方(响应者),以及相关的地址、数据和控制信息。
“这个事务在该
BAR
中终结”意味着一个事务的目标地址(也就是事务要访问的最终地址)落在某个特定的基址寄存器所定义的地址范围内。当发起一个事务时,系统会检查事务的目标地址,看它是否处于某个
BAR 所指定的地址区间内。如果是,就可以说这个事务在该 BAR 中终结(terminates),因为该 BAR 所对应的设备将处理这个事务。
假设一个 PCIe 设备有两个 BAR:
-
BAR0 定义的地址范围是
0x1000 - 0x1FFF
。
-
BAR1 定义的地址范围是
0x2000 - 0x2FFF
。
如果发起一个内存读事务,其目标地址是
0x1500
,由于
0x1500
落在 BAR0 所定义的地址范围
0x1000 - 0x1FFF
内,那么就称这个事务在 BAR0 中终结。之后,系统会根据这个关系,将事务的地址进行转换,具体转换方式就是在 BAR0 的基地址上加上事务地址相对于 BAR0 起始地址的偏移量,从而完成地址的映射和事务的处理。
基于查表的转换Lookup Table based Translation:
在此方案中,BAR使用一个特殊的查找表对其窗口内的事务进行地址转换。这种方法在将本地地址映射到主机总线地址方面提供了更大的灵活性,因为地址内索引字段的位置是可编程的,可以调整窗口大小。索引用于为新的内存位置提供高位。
处理器间通信Inter-processor communication:
NTB还允许网桥两侧的主机通过便签式寄存器(scratchpad registers)、门铃寄存器(doorbell registers)和心跳消息(heartbeat messages)交换有关状态的信息。
Scratchpad Registers
:
这些寄存器从非透明桥的两侧都可以读可以写。它们可以在主总线设备和次总线设备之间传递控制和状态信息,也可以是通用读
/
写寄存器。
Doorbell Registers:
这些寄存器用于将中断从NTB的一侧发送到另一侧。这些是软件控制的中断请求寄存器,在非透明桥上的每个接口都有与之相关联的掩码寄存器 (masking register)。这些寄存器可以从网桥的主接口或从接口访问。
Heartbeat Messages:
心跳消息从主主机发送到从主机,以指示主主机仍然处于活动状态。从主机监视主主机的状态,并在检测到故障时采取适当的行动。门铃寄存器是可用于心跳信息的。当从主机未能接收到一定数量的所安排的周期性的心跳消息时,会宣布主主机发生故障。
NTB 中的 doorbell registers、message registers ,便签式寄存器等有相似之处,都可用于系统间通信,但也有区别。doorbell registers 主要用于发送中断事件,message registers 除了可用于信息交换外,还设有特殊的状态位,以防止信息被其他端重写,而scratchpad registers 更侧重于提供一个简单的、可直接读写的信息交换空间。
举例:Intelligent Adapter Card