使用分段队列远程数据存取的设备互联失效备援系统和方法_5

文档序号:9621379阅读:来源:国知局
r>[0072]图10所示的队列可以配置为循环队列且不会超限,意味着队列具有固定数量的缓冲区,一旦队列满了之后,将无法折回进行写操作且无法对包含未读消息的缓冲区位置进行覆盖。这个特征可以避免由于覆盖所导致的队列中消息的丢失,且不需要通过数据链路交换头指针和尾指针的位置信息。在这种情况下,写操作必须等待读操作读取消息内容,空出对应的消息缓冲区并清除缓冲状态标志之后进行,因此,写实体的写操作仅在空的消息缓冲区可用时发生。而且,读操作需要完成下个队列片段中所有消息缓冲区的消息的读取,并在可能进行的写操作之前将授权访问该片段。循环队列的好处在于固定数量的缓冲区可以避免队列空间无限制增长的可能性,以避免耗尽计算设备的存储器,导致系统失效。另一优点在于,低时延系统中的循环队列在系统主存储器开启时,便对对列中所有消息缓冲区的位置进行预置,以避免在新消息加入队列中时,在系统主存中为新消息分配新消息缓冲区的相对冗余的过程。很明显地,可以通过不再需要等待读操作使得队列片段中的消息缓冲区可用进行写操作,以优化时延。因此,最好的是通过将系统配置为读操作多于写操作,否则,当写操作多于读操作时,队列将会填满,且写操作需要等到读操作在读取下一片段队列中所有消息缓冲区的消息之后才可以向下一队列中写消息。这可以有利地减少时延,尤其在远程存储器访问设备互联系统中。
[0073]消息队列72和76包括可以至少划分为2个队列片段164的多个消息缓冲区162。消息缓冲区162可以用作链接列表和作为循环队列,意味着队列中的最后一个缓冲区连接至队列中的第一个缓冲区。在本实施例中,队列是固定长度的,例如,包括固定数量的消息缓冲区162。消息缓冲区162可以配置为缓冲数据消息,如这里其他地方介绍的消息86,90,86-1/n,以及 90-1/n。
[0074]各消息缓冲区162可以为任意实际的尺寸,如一个或多个字节。各队列片段164可以包括两个或多个消息缓冲区162,且并不是所有的消息片段164需要具有相同数量的消息缓冲区162。所使用的消息片段164的实际数量也可以任意,当然最好是两个消息片段。
[0075]消息状态标志166用于各消息缓冲区162。各消息状态标志166可以具有一个字节的长度或者其他适宜的长度,例如,可以是各消息缓冲区162的第一个或者最后一个字节。消息状态标志166的一种状态表示消息缓冲区162中的消息是有效的或者“入队”(en-qUeUed)且待读取的(未读)。这种有效状态可以用非零值表示(如非“00”的十六进制的数值)。消息状态标志166的其他状态表示各消息缓冲区162中的消息无效或“出队”(de-queued)且已读。无效状态可以选取零值(如十六进制的数值“00”)。消息状态标志166的有效状态作为从各消息缓冲区162读取消息的条件。在读取消息之后,将状态标志设置为无效状态作为读取操作的一部分。
[0076]片段防御标志168用于队列片段164。各片段防御标志168具有一个字节的长度或者其他适宜的长度。片段防御标志168的状态表示各消息片段164处于开启状态,其可以接收新消息且可以将新消息写入队列片段164的消息缓冲区162中。这种情况存在于只要读指针没有指向消息片段164中的任何消息缓冲区时。这种开启状态可以选取零值进行表示(例如,十六进制的“00”)。片段防御标志168的另一状态,表示各队列片段164是关闭的,其不接收新消息且无法将新消息写入队列片段164的消息缓冲区162中。这种情况在只要读指针志向队列片段164的一个消息缓冲区162时发生。为了获得低时延,写操作时可以在写之前不对各消息缓冲区的状态进行核对,以为执行额外的读操作节省时间。相反,写指针仅允许在在所有消息缓冲区均可以进行写操作才指向队列片段。因此,写操作可以以不进行核对的速度继续操作队列片段164的第一个消息缓冲区片段直到其在该片段中写最后一个消息缓冲区。片段防御标志168的关闭状态可以选取非零值进行表示(如十六进制的“FF”)。片段防御标志168被核查为开启状态是向各个队列片段164中的消息缓冲区162写消息的条件。当正在从队列片段164中的消息缓冲区162中读取消息时,片段防御标志168被设置为关闭状态。一旦将队列片段164中的最后一个消息读取完毕,片段防御标志168被设置为开启状态,清除以使得读指针可以指向该队列片段164。分段队列的这种使用方式的好处在于,第一计算设备54无需对头指针的位置进行持续的追踪,也不需要接收头指针位置改变时的更新消息,它仅需要核对是否允许将尾指针指向下一个消息队列。这在实质上减少了控制消息的数量,即通过第一链路62和第二链路66交互的数据量,以进一步提尚消息吞吐量并减少时延。
[0077]可以使用两个指针170和172进行向队列72和76中写或读。在向队列72中的消息缓冲区162中写消息时,尾指针170作为参考并改进为指向队列72中的方向174。尾指针170仅需要由第一计算设备54知道并进行追踪。在从相应的队列76中的消息缓冲区162中读取消息时,头指针172作为参考并改进为指向队列76中的相同方向174。尾指针170的移动,通过或者至少部分地通过下一队列片段164的片段防御标志168的状态进行控制。头指针172的移动,通过或者至少部分地通过下一消息缓冲区162的消息状态标志166的状态进行控制。各片段防御标志168可以阻止尾指针170指向头指针172指向的队列片段164中消息缓冲区162,以避免队列片段164中消息缓冲区162中的消息被过早地覆盖。消息状态标志166可以阻止头指针172指向包含已经被读取的旧消息的消息缓冲区162。
[0078]当将这种队列用作队列72,76,80,84时,第一计算设备54维护尾指针170来进行写消息,第二计算设备58则维护头指针172来进行读取消息。也就是说,第一计算设备54按照所接收的第二计算设备58设置并发送的片段防御标志168的状态,向激活队列72,80的尾指针170指向的位置写消息。第二计算设备58则按照所接收的第一计算设备54设置并发送的消息状态标志166的状态,从激活队列76,84中读取消息。在对第二链路66相关的队列80和84执行失效备援之后,第二计算设备58仅需要将头指针172重新移动回指向正在写入的消息队列164的第一个消息缓冲区162即可,与此同时,第二计算设备58丢弃所读取的任何重复的消息。例如,当第一计算设备54将队列72复制到存储空间93中的队列80中时,第一处理器56可以将消息状态标志166重新设置为“有效”,同时,使用远程存储器访问功能映射该标志至第二计算设备58上的队列84,使得头/读指针172可以重新读取该消息。可选地,第二计算设备58可以检测出失效备援模式,并可以将消息状态标志166进行重置并重新读取该消息。这可以消除第一链路62失效和第二链路66激活过程中消息丢失的可能性。
[0079]另外,图10中示出的片段队列可以对第一计算设备54和第二计算设备58之间链路相关的其他种类的错误进行检测,且这种错误可以用于触发失效备援流程。如果尾指针170等待片段防御标志168进行开放的时间长于预设的时间,则第一计算设备54可以确定第一链路62中发生了错误,并可触发这里其他地方讨论的失效备援流程。例如,可以使用计时器对指向队列片段164的最后一个消息缓冲区162的时间进行计时,当计时超过阈值时,可以确定第一链路62上发生了错误。因此,如果尾指针170在经过一段时间后并没有指向下一个队列片段,可以假设发生了某种链路失效。
[0080]图8和图10仅对队列进行了示意,并不构成对队列的限制。例如,虽然其中示出了特定数量的存储器位置/缓冲区,可以理解的是,队列中可以包括任意数量的存储位置。可以理解的是,在转向下一个队列片段之前,数量众多的存储位置可以增加队列片段中待处理的消息的数量,这或许可以提高性能。但是,队列中的位置越多,所占用的存储器空间就越大,也即在从主要链路失效中恢复时需要重新传输的复制消息就越多。
[0081]与第一计算设备54类似,第二计算设备58可以是任意类型的计算设备,其通常配置为发送、接收或者处理消息86-1至86-n。在本实施例中,第二计算设备具有与第一计算设备相同(或至少本质上相同)的计算环境。消息86-1至86-n从第一计算设备54向第二计算设备58传输的顺序与消息86-1至86-n在队列72中的存储顺序相同。
[0082]第一链路62总体上配置为携带表示第一计算设备54和第二计算设备58之间传输的消息86的电信号。在本实施例中,第一链路62是一根被配置为携带从第一通信接口卡70向第二通信接口卡78传输的符合PCIe标准的电信号的电缆。可以领会的是,第一链路62在使用PCIe标准且不使用任何中间协议的基础上为第一计算设备54和第二计算设备58之间提供直接连接。因此,多个消息86-1至86-n可以从第一通信接口卡70相关的队列72传输至第二通信接口卡74相关的队列76中,使得多个消息86-1至86_n在队列76中的存储顺序与在队列72中的存储顺序相同。
[0083]在图9示出的失效备援过程中,第一处理器56将整个队列72中的多个消息86_1至86-n复制到第三通信接口卡78相关的存储空间93中的队列80,作为镜像消息90_1,90-2,90-3至90-n的顺序与存储的多个消息86_1至86_n的顺序相同。可以理解,在复制多个消息86-1至86-n之后,队列80将实质上与队列72相同,这样远程存储器访问服务可以通过第二链路66将整个复制的队列80中的消息传输到队列84中。多个消息86-1至86-n的复制方式并不受特定的限制。例如,多个消息86-1至86_n可以由第一处理器56按照顺序读取在队列80中重新生成。
[0084]在本实施例中,从最旧的消息开始重新读取队列84中的消息,第二计算设备将队列84接收到的消息90的序列号与队列76中消息86的序列号进行比较,以确定链路失效发生的位置。在链路失效之前成功接收到的队列76的消息作为副本在队列84中将被丢弃。队列84的第一个单一序列号表示消息传输中链路失效发生位置的点。队列84的相应的读指针将被重置,以继续
当前第5页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1