网络中的远程直接存储器访问通信方法和对应控制器与流程-j9九游会真人

文档序号:35714135发布日期:2023-10-12 17:50阅读:28来源:国知局


1.本发明大体上涉及数据通信领域,更具体地,涉及一种网络中的远程直接存储器访问通信方法和对应控制器。


背景技术:

2.目前,远程直接存储器访问(remote direct memory access,rdma)是一种广泛用于数据中心和计算机集群的数据通信技术,以实现低延迟和高带宽网络。rdma将存储器操作从例如计算机群集中的计算机的中央处理单元(central processing unit,cpu)卸载到远程网络接口控制器(remote network interface controller,rnic),所述rnic直接访问存储器以执行rdma存储器操作。rdma存储器操作的示例包括读取、写入或原子操作。从存储器操作中卸载可以节省cpu时间,并使cpu能够执行其他任务。
3.通常,在rdma通信中,软件层(即,上层应用层)使用“verbs”软件应用编程接口(software application programming interface,api)执行rdma存储器操作,所述rdma存储器操作随后转换为写入rnic中队列的工作请求。每个工作请求都可以被称为工作队列元素(work queue element,wqe)。每个wqe都独立于其他wqe,wqe写入队列的顺序除外。事实上,“verbs”api调用可能会由rdma中间件转换为wqe,所述wqe被发送到rnic进行处理。rnic的处理可以减轻主cpu自身处理rdma存储器操作的负担,从而减少上层应用层的cpu周期要求。但是,上层应用层仍然负责跟踪和处理cpu发出的rdma存储器操作的结果,以启动新的rdma存储器操作。或者,上层应用层处理和评估先前请求的结果,以确定要执行的下一个请求的内容。然而,上层应用层为此处理以及软件执行消耗cpu周期,以确定下一个请求较慢且严格序列化,因为需要等待先前请求的完成及其结果,然后再继续。在示例中,多个请求不能一起发出。因此,从上层应用层的角度来看,操作延迟更高。此外,这使得数据通信的计算资源更加密集,并提高了存储器利用率。
4.因此,鉴于上述讨论,需要克服上述与涉及远程直接存储器访问(remote direct memory access,rdma)的传统数据通信相关联的缺点。


技术实现要素:

5.本发明提供了一种用于通过远程直接存储器访问在网络上处理从请求方到响应方的数据请求的方法和控制器。本发明提供了一种对由于上层应用层处理无效而涉及rdma的高延迟和cpu密集型数据通信的现有问题的j9九游会真人的解决方案,其中首先处理先前请求的结果,并且需要等待先前请求完成,以便确定要执行的下一个请求的内容。本发明的目的是提供一种j9九游会真人的解决方案,所述j9九游会真人的解决方案至少部分地克服了现有技术中遇到的问题,并提供改进的方法和系统,所述方法和系统通过在请求重试失败的情况下,在两个或两个以上请求(即,wqe)之间或在一个请求与自身之间建立条件和动态依赖关系来相较于传统rdma系统提供更低的延迟和更少的cpu数据密集型通信。
6.本发明的目标是通过所附独立权利要求中提供的j9九游会真人的解决方案来实现的。本发明的有
利实现方式在从属权利要求中进一步定义。
7.在一个方面中,本发明提供了一种通过远程直接存储器访问在网络上处理从请求方到响应方的数据请求的方法,所述方法包括所述请求方向网络接口控制器的工作队列发送两个或两个以上请求,所述网络接口控制器通过向所述响应方发送排队请求,并从所述响应方接收对所发送请求的响应,执行所述排队请求,其中一个或多个给定请求均包括与所述响应方对所述工作队列中一个或多个先前请求的所述响应相关的依赖关系信息,所述方法还包括:在所述网络接口控制器执行所述给定请求之前,评估所述依赖关系信息并根据所述评估的结果执行所述给定请求。
8.与传统rdma系统相比,本发明的方法提供了涉及减少的cpu周期和更低延迟的改进的数据通信。所述方法能够在两个或两个以上请求之间创建条件依赖关系。因此,两个或两个以上请求可以一起发出。传统上,上层应用层处理和评估先前请求的结果,以确定要执行的下一个请求的内容,这消耗了大量cpu周期。然而,在本发明中,上层应用层被卸载,因为网络接口控制器负责评估依赖关系信息和执行请求。因此,传统上用于处理、跟踪和执行请求的cpu(例如请求方的cpu)得以释放以用于执行其他任务,使得与传统方法相比,所述方法的资源密集度较低。
9.在一种实现方式中,在所述方法中,所述依赖关系信息包括用于标识所述工作队列中的所述一个或多个先前请求的一个或多个请求标识符以及要评估的条件信息。
10.借助于一个或多个请求标识符,可以显式或隐式地标识一个或多个先前请求,以执行请求(即,当前请求)。条件信息能够标识与一个或多个先前请求相关联的条件。
11.在另一实现方式中,在所述方法中,所述条件信息包括一个或多个数据位置以及要对数据执行的一个或多个操作,其中所述数据位于所述请求标识符分别标识的一个或多个所述先前请求的所述结果中的其中一个所述数据位置。
12.一个或多个数据位置能够标识一个或多个先前请求的结果中用于执行一个或多个操作的数据。
13.在另一实现方式中,在所述方法中,所述条件信息中的至少一个所述操作包括从位于其中一个所述标识的先前请求的所述结果中的其中一个所述数据位置的所述数据,或从位于一个或多个所述标识的先前请求的所述结果中的一个或多个所述数据位置的数据的组合导出要用于执行对应的给定请求的值。
14.导出在一个或多个数据位置处标识的数据,以能够执行依赖于一个或多个先前请求的给定请求。
15.在另一实现方式中,在所述方法中,所述条件信息包括要用于一个或多个所述操作的一个或多个值。
16.在操作执行期间,相对于从标识的先前请求中的数据位置导出的值,使用一个或多个值。
17.在另一实现方式中,在所述方法中,所述条件信息中的至少一个所述操作包括要对位于其中一个所述标识的先前请求的所述结果中的其中一个所述数据位置的数据,或对位于一个或多个所述标识的先前请求的所述结果中的一个或多个所述数据位置的数据的组合与所述条件信息中的其中一个所述值或所述条件信息中的两个或两个以上所述值的组合执行的比较。
18.通过比较,方法能够识别先前请求的结果中的数据是否与条件信息中的值相似,在此基础上执行依赖于先前请求的给定请求。
19.在另一实现方式中,在所述方法中,包括依赖关系信息的请求(wqe1、wqe2)排队进入所述网络接口控制器的所述工作队列时,从依赖请求和依赖的先前请求中提取所述依赖关系信息并将其存储到依赖关系信息数据库中。
20.依赖关系信息被提取并存储到所述依赖关系信息数据库中,以能够执行至少一个操作。
21.在另一实现方式中,在所述方法中,当从响应方接收对给定请求的所述响应时,所述网络接口控制器向所述依赖关系信息数据库查询包括所述给定请求的标识符的依赖关系信息,并将响应中的数据存储到所述网络接口控制器中的依赖关系响应数据存储器中和/或存储到主机中分配给所述网络接口控制器的依赖关系响应数据存储器中,其中所述数据位于查询的依赖关系信息中包括的数据位置处。
22.响应方对给定请求的响应以与给定请求的标识符相关联的方式存储,使得能够在响应与先前存储的一个或多个值之间执行至少一个操作。
23.在另一实现方式中,在所述方法中,评估给定请求的所述依赖关系信息包括:向所述依赖关系信息数据库查询所述给定请求的依赖关系信息;获得存储在所述依赖关系响应数据存储器中的所述数据,其中所述数据对应于与其标识符包括在所述查询的依赖关系信息中的所述先前请求的执行结果;对所述获得的数据执行所述查询的依赖关系信息中包括的操作。
24.依赖关系信息数据库的查询更容易,因为依赖关系信息是根据请求的标识符存储的。获得存储到依赖关系响应数据存储器中的数据,以能够利用依赖关系信息执行此数据的操作。
25.在另一实现方式中,在所述方法中,评估所述依赖关系信息至少部分地由所述网络接口控制器执行。
26.网络接口控制器对依赖关系信息的评估能够卸载请求方的cpu,从而节省cpu时间,并使得cpu能够释放以用于执行其他任务。
27.在另一方面中,本发明提供了一种用于通过远程直接存储器访问在网络上处理从请求方到响应方的数据请求的控制器,所述控制器用于:同意所述请求方发出的两个或两个以上请求(wqe1、wqe2)进入工作队列;通过向所述响应方发送排队请求(wqe1、wqe2),并从所述响应方接收对之前所发送请求的响应,执行所述排队请求,其中一个或多个给定请求均包括与所述响应方对所述工作队列中一个或多个先前请求的所述响应相关的依赖关系信息,所述控制器还用于:在执行所述给定请求之前,至少部分地评估所述依赖关系信息并根据所述评估的结果执行所述给定请求。
28.本发明的控制器提供了涉及减少的cpu周期和更低延迟的改进的数据通信。控制器能够在两个或两个以上请求之间创建条件依赖关系。因此,两个或两个以上请求可以一起发出。传统上,上层应用层处理和评估先前请求的结果,以确定要执行的下一个请求的内容,这消耗了大量cpu周期。然而,在本发明中,上层应用层被卸载,因为控制器负责评估依赖关系信息和执行请求。因此,传统上用于处理和执行请求的cpu(例如请求方的cpu)得以释放以用于执行其他任务。
29.在另一方面中,本发明提供了一种用于通过远程直接存储器访问在网络上通过控制器向响应方发送数据请求的请求方,所述请求方用于通过向所述响应方发送两个或两个以上请求(wqe1、wqe2),并从所述响应方接收对所发送请求(wqe1、wqe2)的响应,向所述控制器的工作队列发出所述两个或两个以上请求;
30.所述请求方还用于发出一个或多个给定请求,使得所述一个或多个给定请求包括与所述响应方对所述工作队列中一个或多个先前请求的所述响应相关的依赖关系信息,所述依赖关系信息旨在执行所述给定请求之前进行评估,使得所述给定请求的所述执行取决于所述评估的结果。
31.本发明的请求方提供了涉及减少的cpu周期和更低延迟的改进的数据通信。请求方能够在两个或两个以上请求之间创建条件依赖关系。因此,两个或两个以上请求可以一起发出。传统上,上层应用层处理和评估先前请求的结果,以确定要执行的下一个请求的内容,这消耗了大量cpu周期。然而,在本发明中,上层应用层被卸载,因为控制器负责评估依赖关系信息和执行请求。因此,传统上用于处理和执行请求的cpu(例如请求方的cpu)得以释放以用于执行其他任务。
32.应当理解的是,所有上述实现方式可以组合在一起。需要说明的是,本技术中描述的所有设备、元件、电路、单元和构件都可以在软件或硬件元件或其任何类型的组合中实现。本技术中描述的各种实体所执行的步骤以及所描述的各种实体要执行的功能均意在指各个实体用于执行各个步骤和功能。虽然在以下特定实施例的描述中,外部实体要执行的特定功能或步骤没有在执行特定步骤或功能的实体的具体详述元件的描述中反映,但是技术人员应清楚,这些方法和功能可以在相应的软件或硬件元件或其任何类型的组合中实现。可以理解的是,在不脱离由所附权利要求书所定义的本发明的范围的情况下,本发明的特征易于以各种组合进行组合。
33.根据结合以下所附权利要求书解释的附图和说明性实现方式的详细描述,本发明的其他方面、优点、特征和目的将变得显而易见。
附图说明
34.结合附图阅读可以更好地理解上述发明内容以及说明性实施例的下列详细描述。为了说明本发明,在附图中示出本发明的示例性结构。然而,本发明并不限于本文公开的特定方法和手段。此外,本领域的技术人员将理解,这些附图并非按比例绘制。在可能的情况下,相同的数字表示相同的元件。
35.现将仅通过举例,参考以下图式对本发明实施例进行描述,其中:
36.图1为根据本发明实施例的用于通过远程直接存储器访问在网络上处理从请求方到响应方的数据请求的方法的流程图;
37.图2为根据本发明实施例的用于通过远程直接存储器访问在网络上处理从请求方到响应方的数据请求的控制器的框图;
38.图3为根据本发明实施例的用于通过远程直接存储器访问在网络上通过控制器向响应方发送数据请求的请求方的框图;
39.图4a、4b和4c为根据本发明各种实施例的用于通过远程直接存储器访问在网络上处理从请求方到响应方的数据请求的方法的示例性实现方式;
40.图5为根据本发明实施例的控制器执行的通过远程直接存储器访问在网络上处理从请求方到响应方的数据请求的方法的示例性实现方式;
41.图6为根据本发明另一实施例的控制器执行的通过远程直接存储器访问在网络上处理从请求方到响应方的数据请求的方法的示例性实现方式。
42.在附图中,下划线数字用于表示下划线数字所在的项或下划线数字相邻的项。不带下划线的数字与将不带下划线的数字链接到项的线所标识的项相关。当数字不带下划线但带有相关联箭头时,不带下划线的数字用于标识箭头所指的一般项。
具体实施方式
43.以下详细描述说明了本发明实施例及其可实现的方式。虽然已公开实施本发明的一些模式,但本领域的技术人员将认识到,也可以实现用于实施或实践本发明的其他实施例。
44.图1为根据本发明实施例的用于通过远程直接存储器访问在网络上处理从请求方到响应方的数据请求的方法的流程图。参考图1,示出了方法100。方法100在例如图2中描述的控制器处执行。方法100包括步骤102和104。
45.在一个方面中,本发明提供了一种用于通过远程直接存储器访问在网络上处理从请求方到响应方的数据请求的方法100,所述方法100包括
46.请求方向网络接口控制器的工作队列发送两个或两个以上请求,
47.网络接口控制器通过将排队请求发送到响应方,并从响应方接收对所发送请求的响应,执行所述排队请求,
48.其中一个或多个给定请求均包括与来自响应方的对工作队列中一个或多个先前请求的响应相关的依赖关系信息,所述方法100还包括:在网络接口控制器执行给定请求之前,评估依赖关系信息并根据评估的结果执行给定请求。
49.方法100能够通过远程直接存储器访问在网络上处理从请求方到响应方的数据请求。远程直接存储器访问(remote direct memory access,rdma)用于涉及请求方和响应方的数据中心和计算机集群,以在处理数据请求时实现低延迟和高带宽网络。方法100包括处理请求方向响应方提供的数据请求(例如读数据、写入数据)。
50.在步骤102,方法100包括请求方向网络接口控制器的工作队列发送两个或两个以上请求。两个或两个以上请求由请求方发送到工作队列中,以能够按定义的顺序执行请求。工作队列是指请求方发出的所有请求的日志,以便能够有序地标识请求以供执行。网络接口控制器(network interface controller,nic)用于使用远程直接存储器访问来执行两个或两个以上请求。有益的是,远程直接存储器访问将存储器操作从请求方的中央处理单元(central processing unit,cpu)卸载到网络接口控制器。这种卸载节省了cpu时间,因此cpu得以释放以执行其他任务。
51.在一个示例中,

verbs’软件api用于执行远程直接存储器访问操作,并将两个或两个以上请求写入网络接口控制器的工作队列。工作队列中的每个请求都可以称为工作队列元素(work queue element,wqe)。工作队列元素用于标记(单边写入/读取/原子)操作和未标记(双边发送/接收)操作。
52.在步骤104,方法100包括网络接口控制器通过将排队请求发送到响应方,并从响
应方接收对所发送请求的响应来执行排队请求。网络接口控制器用于根据工作队列执行请求。在一个示例中,网络接口控制器向响应方发送原子请求,并进一步从响应方接收基于原子请求的原子响应。原子请求是指在响应方的特定地址执行存储器操作(例如64位)的请求。原子请求可用于在特定地址对存储器进行读取、修改和写入。
53.一个或多个给定请求均包括与来自响应方的对工作队列中一个或多个先前请求的响应相关的依赖关系信息,所述方法100还包括:在网络接口控制器执行给定请求之前,评估依赖关系信息并根据评估的结果执行给定请求。与一个或多个给定请求相关联的依赖关系信息能够建立一个或多个给定请求对一个或多个先前请求的依赖。在一个示例中,在两个请求(如给定请求与先前请求)之间创建条件和动态依赖关系。因此,根据对依赖关系信息的评估,可以同时发出两个或两个以上请求。与处理一个或多个先前请求的结果以确定下一个要执行的请求,因此需要等待一个或多个先前请求的结果的传统数据通信形成对比。有益的是,与传统数据通信相比,本发明的方法100在请求方的cpu上更快且计算机密度更低,在传统数据通信中,由于需要等待请求完成及其结果,并且分析和操纵此结果以便发布下一个请求,然后再继续,因此请求的执行更慢且严格序列化,消耗了更多cpu周期。
54.在一个示例中,仅当先前请求的32位值等于定义值时,或仅当先前请求的64位值的写入/读取/原子操作地址等于定义值时,或仅当先前请求的128位值的写入/读取/原子操作地址、长度和远程密钥等于定义值时,依赖关系信息包括一个或多个请求的执行。在另一个示例中,依赖关系信息包括由于先前的读取/原子操作而改变目标主机(即,响应方),这将使wqe移动到不同队列对(queue pair,qp)的不同发送队列(send queue,sq),并且数据将发送到不同目标,例如,当控制器读取目标存储器的位置时,所述控制器会将下一个wqe引导到连接到所述主机的qp。
55.根据一个实施例,依赖关系信息包括用于标识工作队列中的一个或多个先前请求的一个或多个请求标识符以及要评估的条件信息。借助于一个或多个请求标识符,可以显式或隐式地标识一个或多个先前请求,以执行请求(即,当前请求)。条件信息能够标识与一个或多个先前请求相关联的条件。在一个示例中,通过使用分配给先前请求的唯一标识符,一个或多个先前请求的请求标识符可以是显式的。在另一个示例中,通过指示当前依赖请求与其所依赖的一个请求之间的距离:即

先前请求’或

第五个先前请求’,一个或多个先前请求的请求标识符可以是隐式的。多个请求可能依赖于同一请求,一个请求可能依赖于已经依赖于另一请求的请求。传统上,上层应用层处理和跟踪先前请求的响应,以确定要执行的下一个请求的内容。在本方法100中,作为实现方式的示例,当上层应用层发出请求时,上层应用层返回请求的唯一标识符,例如名为

opid’。

opid’可以是rdma中间件分配的工作队列元素标识符(work queue element identifier,wqe-id)。此外,当上层应用层发出另一个请求时,上层应用层限定由另一个请求的相应

opid’标识的对先前请求的执行依赖。要评估的条件信息是指与一个或多个先前请求相关联的一个或多个条件,其中一个或多个请求依赖于所述一个或多个条件。
56.根据一个实施例,条件信息包括一个或多个数据位置以及要对数据执行的一个或多个操作,其中数据位于所述请求标识符分别标识的一个或多个先前请求的结果中的其中一个所述数据位置。一个或多个先前请求中的一个或多个数据位置可以包括偏移值和偏移长度。在一个示例中,一个或多个数据位置包括字节偏移量和字节长度,例如1、2、4、8、16。
一个或多个数据位置能够标识一个或多个先前请求的结果中用于执行一个或多个操作的数据。换句话说,一个或多个操作是根据一个或多个数据位置处的数据执行的。在示例中,当处理条件信息时,条件信息可以分发并且包括一个或多个先前请求的信息,从而使得条件信息与一个或多个先前请求相关联。
57.根据实施例,条件信息中的至少一个操作包括从位于其中一个标识的先前请求的结果中的其中一个数据位置的数据,或从位于一个或多个标识的先前请求的结果中的一个或多个数据位置的数据的组合导出要用于执行对应的给定请求的值。导出在一个或多个数据位置处标识的数据,以能够执行依赖于一个或多个先前请求的给定请求。在示例中,根据偏移值和偏移长度从位于其中一个数据位置的数据导出值。此外,可以用可选的掩码值按位掩蔽此类值。值的掩蔽使数据位置处的值易于标识。此外,来自数据位置的值可以存储在网络接口控制器中,和/或存储到主机中分配的存储器中。
58.根据实施例,条件信息包括要用于一个或多个操作的一个或多个值。在操作执行期间,相对于从标识的先前请求中的数据位置导出的值,使用可预先存储的一个或多个值。
59.根据实施例,条件信息中的至少一个操作包括要对位于其中一个标识的先前请求的结果中的其中一个数据位置的数据,或对位于一个或多个标识的先前请求的结果中的一个或多个数据位置的数据的组合与条件信息中的一个值或条件信息中的两个或两个以上值的组合执行的比较。通过比较,方法能够识别先前请求的结果中的数据是否与条件信息中的值相似,在此基础上执行依赖于先前请求的给定请求。在示例中,方法100包括将条件信息中的值与位于标识的先前请求的一个或多个数据位置中的数据进行比较。如果比较结果为true,则执行操作。如果比较结果为false,则报告错误。此外,当比较结果为false时,跳过依赖操作,或挂起队列对(queue pair,qp),或停止队列对。此外,当比较结果为false时,依赖请求(即,先前请求)可以在中止并报告错误之前重试指定的次数。此外,当比较结果为false时,被依赖请求(即,先前请求)和依赖请求(即,依赖于先前请求的请求)可以在中止并报告错误之前重试指定的次数。比较操作可以使用以下任何关系:等于(=)、不同(!=)、大于(》)、小于(《)、大于或等于(》=)、小于或等于(《=)、按位取反(^)等。位于一个或多个标识的先前请求的结果中的其中一个数据位置的数据的组合可以包括单个请求中的不同数据位置、不同请求中的相同数据位置、不同请求中的不同数据位置、某些请求的相同数据位置以及其他请求的其他数据位置。
60.根据实施例,条件信息中的至少一个操作包括积分。在此操作中,从先前请求导出的值用作当前请求的参数。导出值可以填充目标队列对(queue pair,qp)、虚拟地址(virtual address,va)、远程密钥(r_key)等参数。
61.根据实施例,在控制器不能存储依赖关系信息的情况下,报告新的

无依赖资源’错误或存在的等效错误。如果发出依赖请求,并且所述依赖请求引用已经完成的先前请求和/或引用不再存储其响应的先前请求,则报告新的

依赖引用错误’或存在的等效错误。如果在执行请求期间发现错误,即具有依赖的其他请求,则在所有依赖请求中设置错误状态。在示例中,针对每个此类依赖请求定义并报告新的错误代码“无法评估依赖”错误。
62.根据实施例,当包括依赖关系信息的请求(wqe1、wqe2)排队进入网络接口控制器的工作队列时,从依赖请求和依赖的先前请求中提取所述依赖关系信息并将其存储搭配依赖关系信息数据库中。请求wqe1指第一工作队列元素,请求wqe2指第二工作队列元素。依赖
关系信息可以与请求(wqe1、wqe2)的唯一标识符存储在一起。依赖关系信息被提取并存储在所述依赖关系信息数据库中,以能够执行至少一个操作。依赖关系信息数据库可以存储在网络接口控制器或请求方主机中,或这两者中。
63.根据实施例,当从响应方接收对给定请求的响应时,网络接口控制器向依赖关系信息数据库查询包括给定请求的标识符的依赖关系信息,并将响应中的数据存储到网络接口控制器中的依赖关系响应数据存储器中,所述数据在所述响应中位于查询的依赖关系信息中包括的数据位置处。处于缓存目的,响应中的此数据也可以或代替地存储到主机中分配给网络接口控制器的依赖关系响应数据存储器中,所述数据在所述响应中位于查询的依赖关系信息中包括的数据位置处。来自响应方的对给定请求的响应以与给定请求的标识符相关联的方式存储,使得能够在响应与先前存储的一个或多个值之间执行至少一个操作(例如比较)。
64.根据实施例,评估给定请求的依赖关系信息包括:向依赖关系信息数据库查询给定请求的依赖关系信息;获得存储在依赖关系响应数据存储器中的数据,其中数据与其标识符包括在查询的依赖关系信息中的先前请求的执行结果;对获得的数据执行查询的依赖关系信息中包括的操作。依赖关系信息数据库的查询更容易,因为依赖关系信息是根据请求的标识符存储的。获得存储到依赖关系响应数据存储器中的数据,以能够利用(给定请求的)依赖关系信息执行(先前请求的)此数据的操作(例如比较)。
65.根据实施例,评估依赖关系信息至少部分地由网络接口控制器执行。网络接口控制器使用远程直接存储器访问对依赖关系信息的评估能够卸载请求方的cpu,从而节省cpu时间,并使cpu能够得以释放以执行其他任务。
66.根据实施例,评估依赖关系信息至少部分地由请求方执行。依赖关系信息的评估部分由请求方(请求方的cpu)执行,其余的评估由网络接口控制器执行。因此,请求方的cpu被部分卸载,并节省cpu时间来执行其他任务。
67.根据实施例,当网络接口控制器支持净荷上的高级功能时,则依赖关系信息的子句也可以引用此类功能。在示例中,在写入-哈希中,网络接口控制器从存储器(例如依赖关系响应数据存储器)读取本地数据、即时计算哈希函数结果,并仅写入哈希函数的结果。在另一个示例中,在读取-哈希中,响应方的网络接口控制器从存储器读取数据、即时计算哈希函数结果,并仅用哈希函数的结果作为响应。在另一个示例中,在比较-缓冲中,网络接口控制器向响应方发送数据,其中响应方的网络接口控制器将所述数据与指示的存储器进行比较,且将结果(是否完全相等)返回给请求方。网络接口控制器的嵌入式净荷功能为与网络接口控制器的硬件紧密耦合的硬件加速器。这些加速器使主cpu(请求方cpu)操作的卸载成为可能,这其中意义重大。
68.传统上,上层应用层发出读取操作、等待数据到达、对数据进行哈希函数的计算,然后以哈希值作为净荷发出新的写入操作。在本发明中,利用依赖关系信息,两个操作一起发出,同时指定第二操作是即时对数据进行嵌入式哈希函数的计算,并将结果数据写入存储器。
69.在替代实施例中,rdma中间件可以处理操作的依赖关系信息中的子句(即部分),因此不会修改wqe的数据结构。在另一个替代实施例中,对操作的依赖关系信息中的子句的处理可以在网络接口控制器的硬件、网络接口控制器的固件和rdma的中间件之间划分。在
另一个替代实施例中,对依赖关系信息中的子句的处理可以改变接收队列(receive queue,rq)中wqe的参数的值,使得处理wqe的发送队列(send queue,sq)的响应影响已经发布到rq的wqe的内容。例如,为了更改为未来入站发送操作的目标存储器缓冲区。在另一个替代实施例中,操作可以依赖于多个先前操作。
70.本发明的方法100提供了涉及减少的cpu周期和更低延迟的改进的数据通信。方法100能够在两个或两个以上请求之间创建条件依赖关系。因此,两个或两个以上请求可以一起发出。传统上,上层应用层处理和评估先前请求的结果,以确定要执行的下一个请求的内容,这消耗了大量cpu周期。然而,在本发明中,上层应用层被卸载,因为网络接口控制器负责评估依赖关系信息和执行请求。因此,传统上用于处理和执行请求的cpu(例如请求方的cpu)得以释放以执行其他任务,使得与传统方法相比,所述方法的资源密集度较低。
71.步骤102和104仅为说明性的,并且还可以在不脱离本文权利要求书的范围的情况下提供其中添加一个或多个步骤、删除一个或多个步骤,或按照不同顺序提供一个或多个步骤的其他替代方案。
72.图2为根据本发明实施例的用于通过远程直接存储器访问在网络上处理从请求方到响应方的数据请求的控制器的框图。参考图2,示出了控制器202。还示出了请求方204、响应方206和网络208。如图2中可见,请求方204和控制器202位于网络中的同一节点或端点上,因此它们不在网络上彼此通信。通常,如图2所示,控制器202是请求方204的一部分。
73.在另一方面,本发明提供了一种用于通过远程直接存储器访问在网络208上处理从请求方204到响应方206的数据请求的控制器202,所述控制器202用于
74.同意请求方204发出的两个或两个以上请求(wqe1、wqe2)进入工作队列,
75.通过将排队请求(wqe1、wqe2)发送到响应方206,并从响应方206接收对之前所发送请求的响应,执行所述排队请求,
76.其中一个或多个给定请求均包括与来自响应方206的对工作队列中一个或多个先前请求的响应相关的依赖关系信息,控制器202还用于:在执行给定请求之前,至少部分地评估依赖关系信息,并根据评估的结果执行给定请求。
77.控制器202也被称为网络接口控制器(network interface controller,nic),是支持远程直接存储器访问(remote direct memory access,rdma)的网络接口控制器。控制器202用于使用远程直接存储器访问来处理和执行来自请求方204的两个或两个以上请求。在一个示例中,控制器202可以通过传输控制协议(transmission control protocol,tcp)套件支持远程直接存储器访问。有益的是,远程直接存储器访问将存储器操作从请求方204的中央处理单元(central processing unit,cpu)卸载到控制器202。这种卸载节省了cpu时间,因此cpu得以释放以执行其他任务。
78.请求方204包括用于:在网络208上向响应方206提供请求(例如wqe1、wqe2)的恰当逻辑、电路、接口和/或代码。请求方204可以与用户相关联(或由用户使用)。请求方204的示例包括但不限于蜂窝电话、个人数字助理(personal digital assistant,pda)、手持设备、无线调制解调器、便携式计算机、个人计算机等。请求方204的示例还可以包括移动台、移动终端、用户站、远程站、用户终端、终端、用户单元、接入终端等。
79.响应方206包括用于:在网络208上从请求方204接收请求(例如wqe1、wqe2)并根据请求提供响应的恰当逻辑、电路、接口和/或代码。响应方206可以与用户相关联(或由用户
使用)。响应方206的示例包括但不限于蜂窝电话、个人数字助理(personal digital assistant,pda)、手持设备、无线调制解调器、便携式计算机、个人计算机等。响应方206的示例还可以包括移动台、移动终端、用户站、远程站、用户终端、终端、用户单元、接入终端等。
80.网络208包括用于促进请求方204与响应方206之间的数据通信的恰当逻辑、电路、接口和/或代码。此外,网络208可以包括但不限于一个或多个对等网络、混合对等网络、局域网(local area network,lan)、无线接入网(radio access network,ran)、城域网(metropolitan area network,man)、广域网(wide area network,wan)、例如称为互联网的全球计算机网络的公共网络的全部或部分、专用网络、蜂窝网络和一个或多个位置处的任何其他通信系统。此外,网络208包括可通过任何数量的已知协议执行的有线或无线通信,包括但不限于互联网协议(internet protocol,ip)、无线接入协议(wireless access protocol,wap)、帧中继或异步传输模式(asynchronous transfer mode,atm)。
81.在操作中,控制器202用于:同意请求方204发出的两个或两个以上请求(wqe1、wqe2)进入工作队列。控制器202同意两个或两个以上请求进入工作队列,以能够按定义的顺序执行请求。工作队列存储请求方204发出的所有请求(wqe1、wqe2和后续请求)的日志,以便能够有序地标识请求以供执行。
82.控制器202还用于通过将排队请求(wqe1、wqe2)发送到响应方206,并从响应方206接收对之前所发送请求的响应,执行所述排队请求。一个或多个给定请求均包括与来自响应方206的对工作队列中一个或多个先前请求的响应相关的依赖关系信息,控制器202还用于:在执行给定请求之前,至少部分地评估依赖关系信息,并根据评估的结果执行给定请求。控制器202用于根据工作队列执行请求。在一个示例中,控制器202向响应方206发送原子请求,并进一步从响应方206接收基于原子请求的原子响应。与一个或多个给定请求相关联的依赖关系信息能够建立一个或多个给定请求对一个或多个先前请求的依赖。在一个示例中,在两个请求(如给定请求与先前请求)之间创建条件和动态依赖关系。因此,根据对依赖关系信息的评估,可以同时发出两个或两个以上请求。与处理一个或多个先前请求的结果以确定下一个要执行的请求,因此需要等待一个或多个先前请求的结果的传统数据通信形成对比。
83.根据实施例,依赖关系信息包括用于标识工作队列中的一个或多个先前请求的一个或多个请求标识符以及条件信息,控制器202用于至少部分地评估条件信息。借助于一个或多个请求标识符,可以显式或隐式地标识一个或多个先前请求,以执行请求(即,当前请求)。条件信息能够标识与一个或多个先前请求相关联的条件。在一个示例中,通过使用分配给先前请求的唯一标识符,一个或多个先前请求的请求标识符可以是显式的。在另一个示例中,通过指示当前依赖请求与其所依赖的一个请求之间的距离:即

先前请求’或

第五个先前请求’,一个或多个先前请求的请求标识符可以是隐式的。多个请求可能依赖于同一请求,一个请求可能依赖于已经依赖于另一请求的请求。控制器202的至少部分评估能够卸载请求方204的cpu。
84.根据实施例,条件信息包括一个或多个数据位置以及要对数据执行的一个或多个操作,其中数据位于所述请求标识符分别标识的一个或多个先前请求的结果中的其中一个所述数据位置。控制器202用于至少部分地执行所述一个或多个操作。一个或多个数据位置
能够标识一个或多个先前请求的结果中用于执行一个或多个操作的数据。一个或多个先前请求中的一个或多个数据位置可以包括偏移值和偏移长度。控制器202根据一个或多个数据位置处的数据执行一个或多个操作。在示例中,当控制器202处理条件信息时,条件信息可以分发并且包括一个或多个先前请求的信息,从而使得条件信息与一个或多个先前请求相关联。
85.根据实施例,条件信息中的至少一个操作包括从位于其中一个标识的先前请求的结果中的其中一个数据位置的数据,或从位于一个或多个标识的先前请求的结果中的一个或多个数据位置的数据的组合导出要用于执行对应的给定请求的值。导出在一个或多个数据位置处标识的数据,以能够执行依赖于一个或多个先前请求的给定请求。在示例中,根据偏移值和偏移长度从位于其中一个数据位置的数据导出值。此外,可以用可选的掩码值按位掩蔽此类值。值的掩蔽使得控制器202能够容易地标识数据位置处的值。此外,来自数据位置的值可以存储在控制器202中。
86.根据实施例,条件信息包括要用于一个或多个操作的一个或多个值。在操作执行期间,相对于从标识的先前请求中的数据位置导出的值,控制器202使用可预先存储的一个或多个值。
87.根据实施例,条件信息中的至少一个操作包括要对位于其中一个标识的先前请求的结果中的其中一个数据位置的数据,或对位于一个或多个标识的先前请求的结果中的一个或多个数据位置的数据的组合与条件信息中的一个值或条件信息中的两个或两个以上值的组合执行的比较。通过比较,控制器202能够识别先前请求的结果中的数据是否与条件信息中的值相似,在此基础上执行依赖于先前请求的给定请求。在示例中,控制器202用于将条件信息中的值与位于标识的先前请求的一个或多个数据位置中的数据进行比较。如果比较结果为true,控制器202则执行操作。如果比较结果为false,控制器202则报告错误。
88.根据实施例,控制器202还用于将从一个或多个请求(wqe1、wqe2)中提取的依赖关系信息存储到依赖关系信息数据库210中,所述一个或多个请求包括依赖关系信息且排队进入控制器202的工作队列。依赖关系信息可以与请求(wqe1、wqe2)的唯一标识符存储在一起。依赖关系信息被提取并存储在依赖关系信息数据库210中,以供控制器202执行至少一个操作。依赖关系信息数据库210可以存储在控制器202或请求方204或这两者中,或存储在控制器202中并在请求方204上复制。
89.根据实施例,控制器202还用于:在从响应方206接收对所述给定请求的响应时,向依赖关系信息数据库210查询包括给定请求的标识符的依赖关系信息,并将响应中的数据存储到依赖关系响应数据存储器212中,所述数据在所述响应中位于查询的依赖关系信息中包括的数据位置处。
90.依赖关系响应数据存储器212在图中示出为处于控制器202中。然而,它也可以位于主机中,作为分配给控制器202的此主机的存储器。接收到的响应中的数据还可以存储在控制器202中的依赖关系响应数据存储器212中和主机中分配给控制器202的依赖关系响应数据存储器中。
91.控制器202将来自响应方206的对给定请求的响应以与给定请求的标识符相关联的方式存储,使得能够在响应与先前存储的一个或多个值之间执行至少一个操作(例如比较)。
memory,eeprom)、随机存取存储器(random access memory,ram)、只读存储器(read only memory,rom)、硬盘驱动器(hard disk drive,hdd)、闪存、固态硬盘(solid-state drive,ssd)或cpu高速缓存存储器。存储器306可以存储用以操作请求方204的操作系统或其他程序产品(包括一个或多个操作算法)。
101.在操作中,处理器302用于通过将两个或两个以上请求(wqe1、wqe2)发送到响应方206,并从响应方206接收对所发送请求(wqe1、wqe2)的响应来将所述两个或两个以上请求发送到控制器202的工作队列中以供所述控制器202执行。两个或两个以上请求由处理器302发送到工作队列中,以能够按定义的顺序执行请求。控制器202用于根据工作队列执行请求。在一个示例中,控制器202向响应方206发送原子请求,并进一步从响应方206接收基于原子请求的原子响应。
102.请求方204的处理器302还用于发出一个或多个给定请求,使得所述一个或多个给定请求包括与响应方206对工作队列中一个或多个先前请求的响应相关的依赖关系信息,所述依赖关系信息旨在执行给定请求之前进行评估,使得给定请求的所述执行取决于评估的结果。与一个或多个给定请求相关联的依赖关系信息能够建立一个或多个给定请求对一个或多个先前请求的依赖。因此,根据对依赖关系信息的评估,可以同时发出两个或两个以上请求。与处理一个或多个先前请求的结果以确定下一个要执行的请求,因此需要等待一个或多个先前请求的结果的传统数据通信形成对比。
103.根据实施例,控制器202可以在请求方204中实现。
104.根据实施例,依赖关系信息包括用于标识工作队列中的一个或多个先前请求的一个或多个请求标识符以及条件信息,请求方204用于至少部分地评估条件信息。借助于一个或多个请求标识符,可以显式或隐式地标识一个或多个先前请求,以执行请求(即,当前请求)。条件信息能够标识与一个或多个先前请求相关联的条件。在一个示例中,通过使用分配给先前请求的唯一标识符,一个或多个先前请求的请求标识符可以是显式的。在另一个示例中,通过指示当前依赖请求与其所依赖的一个请求之间的距离:即

先前请求’或

第五个先前请求’,一个或多个先前请求的请求标识符可以是隐式的。多个请求可能依赖于同一请求,一个请求可能依赖于已经依赖于另一请求的请求。由请求方204和控制器202进行部分评估,以实现请求方204的处理器302的卸载。
105.根据实施例,条件信息包括一个或多个数据位置以及要对数据执行的一个或多个操作,其中数据位于所述请求标识符分别标识的一个或多个先前请求的结果中的其中一个所述数据位置。请求方204用于至少部分地执行所述一个或多个操作。一个或多个数据位置能够标识一个或多个先前请求的结果中用于执行一个或多个操作的数据。一个或多个先前请求中的一个或多个数据位置可以包括偏移值和偏移长度。一个或多个操作是根据一个或多个数据位置处的数据执行的。在示例中,当处理条件信息时,条件信息可以分发并且包括一个或多个先前请求的信息,从而使得条件信息与一个或多个先前请求相关联。
106.根据实施例,条件信息中的至少一个操作包括从位于其中一个标识的先前请求的结果中的其中一个数据位置的数据,或从位于一个或多个标识的先前请求的结果中的一个或多个数据位置的数据的组合导出要用于执行对应的给定请求的值。导出在一个或多个数据位置处标识的数据,以能够执行依赖于一个或多个先前请求的给定请求。在示例中,根据偏移值和偏移长度从位于其中一个数据位置的数据导出值。此外,可以用可选的掩码值按
位掩蔽此类值。值的掩蔽使数据位置处的值易于标识。
107.根据实施例,条件信息包括要用于一个或多个操作的一个或多个值。在操作执行期间,相对于从标识的先前请求中的数据位置导出的值,使用可预先存储的一个或多个值。
108.根据实施例,条件信息中的至少一个操作包括要对位于其中一个标识的先前请求的结果中的其中一个数据位置的数据,或对位于一个或多个标识的先前请求的结果中的一个或多个数据位置的数据的组合与条件信息中的一个值或条件信息中的两个或两个以上值的组合执行的比较。通过比较,请求方204能够识别先前请求的结果中的数据是否与条件信息中的值相似,在此基础上执行依赖于先前请求的给定请求。在示例中,本发明包括将条件信息中的值与位于标识的先前请求的一个或多个数据位置中的数据进行比较。如果比较结果为true,则执行操作。如果比较结果为false,则报告错误。
109.本发明的请求方204提供了涉及减少的cpu周期和更低延迟的改进的数据通信。请求方204能够在两个或两个以上请求之间创建条件依赖关系。因此,两个或两个以上请求可以一起发出。传统上,上层应用层处理和评估先前请求的结果,以确定要执行的下一个请求的内容,这消耗了大量cpu周期。然而,在本发明中,上层应用层被卸载,因为控制器202负责评估依赖关系信息和执行请求。因此,传统上用于处理和执行请求的cpu(例如请求方204的cpu)得以释放以用于执行其他任务。
110.图4a和4b为根据本发明不同实施例的用于通过远程直接存储器访问在网络上处理从请求方到响应方的数据请求的方法的示例性实现方式。结合图2描述图4a和4b。参考图4a和4b,示出了方法400a和400b。示出了请求方204和响应方206。
111.请求方204用于发出两个请求,即称为工作队列元素一(wqe1)的第一请求和称为工作队列元素二(wqe2)的第二请求。wqe2包括与来自响应方206的对wqe1的响应相关的依赖关系信息。依赖关系信息包括作为wqe1的请求标识符,条件信息包括操作:与

=’比较,值:0x12345678,掩码:0xffffffff,值的长度:4,值的位置:1020。wqe1是1千字节的读取操作,wqe2是4字节的写入操作且依赖于wqe1。只有当wqe1净荷中的最后4字节等于值0x12345678时,才会执行wqe2。如果不是,则wqe2将中止,并针对wqe2返回“完成过程中出现错误(completion with error)”。
112.传统上,上层应用层需要等待先前请求完成,读取响应,然后才决定是否发出下一个请求。在本发明中,利用依赖关系信息,两个请求可以一起发出,同时指定仅当第一请求,例如第一/最后32位值等于特定值时才应执行第二请求。
113.在图4a的实现方式中,当wqe1成功完成时,最后4字节为:0x88990001,且wqe2依赖关系为false。因此,不执行wqe2并报告错误。
114.在图4b的实现方式中,当wqe1成功完成时,最后4字节为:0x12345678,且wqe2依赖关系为true。因此,在本实现方式中执行wqe2。
115.图4c为根据本发明另一实施例的用于通过远程直接存储器访问在网络上处理从请求方到响应方的数据请求的方法的示例性实现方式。结合图2描述图4c。参考图4c,示出了方法400c。示出了请求方204和响应方206。
116.请求方204用于发出两个请求,即称为工作队列元素一(wqe1)的第一请求和称为工作队列元素二(wqe2)的第二请求。wqe2包括与来自响应方206的对wqe1的响应相关的依赖关系信息。依赖关系信息包括作为先前wqe的请求标识符,条件信息包括操作:集成虚拟
地址(integrate virtual address,va),值的长度:8,值的位置:0。
117.传统上,上层应用层需要发出读取/原子操作,等待和处理返回的数据,然后才构造新的写入/读取/原子操作。在本发明中,利用依赖关系信息,两个操作可以一起发出,同时指定第二操作的参数由第一操作设置。
118.wqe1为原子操作。wqe2是100mb(兆字节)的写入操作,且依赖于wqe1。wqe2目的地va地址未指示,其值将由wqe1的响应决定。在本实现方式中,当wqe1成功完成时,wqe1的响应为:0x2000100010008990000。因此,wqe2 va设置为:0x2000100010008990000。
119.图5为根据本发明实施例的控制器执行的通过远程直接存储器访问在网络上处理从请求方到响应方的数据请求的方法的示例性实现方式。参考图5,示出了控制器500。示出了依赖关系信息数据库502、依赖关系响应数据存储器506和依赖关系评估引擎504。还示出了发送队列508和完成队列510。还示出了网络512。
120.依赖关系信息数据库502也可以称为依赖关系信息表。依赖关系响应数据存储器506也可以称为存储响应的依赖数据的存储器。
121.如前所述,依赖关系响应数据存储器506也可以定位或复制到主机中,作为分配给控制器500的此主机的存储器。
122.在步骤514,调度wqe1(工作队列元素一)以用于执行。在步骤516,通知控制器500存在用于此wqe1的依赖关系元数据,因此控制器500获取此信息并将其存储到依赖关系信息数据库502中。在步骤518,wqe1的请求数据包传输到网络(并且进一步传输到未示出的响应方)。在步骤520,从网络(从未示出的响应方)接收wqe1的响应数据包。在步骤522,依赖关系评估引擎504向依赖关系信息数据库502查询wqe1的依赖关系信息。在步骤524,依赖关系评估引擎504从响应数据包导出指示的值并将其存储在依赖关系响应数据存储器506中。在步骤526,控制器500通知wqe1成功完成。在步骤528,调度wqe2(工作队列元素二)以用于执行。在步骤530,依赖关系评估引擎504向依赖关系信息数据库502查询wqe2的依赖关系信息。在步骤532,依赖关系评估引擎504从依赖关系信息数据库502获得存储的值并评估条件。在步骤534,条件评估为false,因此不执行wqe2且控制器500通知wqe2的

完成过程中出现错误’。
123.图6为根据本发明另一实施例的控制器执行的通过远程直接存储器访问在网络上处理从请求方到响应方的数据请求的方法的示例性实现方式。结合图5描述图6。参考图6,示出了控制器500。示出了依赖关系信息数据库502、依赖关系响应数据存储器506和依赖关系评估引擎504。还示出了发送队列508和完成队列510。进一步示出了网络512。
124.依赖关系信息数据库502也可以称为依赖关系信息表。依赖关系响应数据存储器506也可以称为存储响应的依赖数据的存储器。
125.同样,依赖关系响应数据存储器506也可以定位或复制到主机中,作为分配给控制器500的此主机的存储器。
126.在步骤602,调度wqe1(工作队列元素一)以用于执行。在步骤604,通知控制器500存在用于此wqe1的依赖关系元数据,因此控制器500获取此信息并将其存储在依赖关系信息数据库502中。在步骤606,wqe1的请求数据包传输到网络(并且进一步传输到未示出的响应方)。在步骤608,从网络(从未示出的响应方)接收wqe1的响应数据包。在步骤610,依赖关系评估引擎504向依赖关系信息数据库502查询wqe1的依赖关系信息。在步骤612,依赖关系
评估引擎504从响应数据包导出指示的值并将其存储在依赖关系响应数据存储器506中。在步骤614,控制器500通知wqe1成功完成。在步骤616,调度wqe2(工作队列元素二)以用于执行。在步骤618,依赖关系评估引擎504向依赖关系信息数据库502查询wqe2的依赖关系信息。在步骤620,依赖关系评估引擎504从依赖关系信息数据库502获得存储的值并评估条件。在步骤622,条件计算为true,因此执行wqe2。
127.在接收端执行依赖的实现方式中,接收报头和元数据输入(如依赖关系信息)。此类报头和元数据输入包括密钥、动作id和动作数据。在示例中,密钥包括qp id:4,操作码:atomicack(0x12),msn:2;动作id包括存储;动作数据包括atomicacketh值。在另一个示例中,密钥包括qp id:8,操作码:读取响应优先(0xd),msn:7;动作id包括比较,动作数据包括大小:32位,偏移:0。这些动作id和动作数据将与默认动作id和默认动作数据进行比较。进一步基于比较,将动作id发送到动作代码,且将动作数据发送到方向动作数据参数。报头和元数据发送到方向数据平面参数。此外,方向数据平面参数和方向动作数据参数发送到动作代码。此动作代码进一步提供报头和元数据作为输出。
128.在发送端执行依赖的实现方式中,接收wqe和元数据输入(如依赖关系信息)。此类报头和元数据输入包括密钥、动作id和动作数据。在示例中,密钥包括qp id:4,opid:3;动作id包括比较(失败时跳过/失败时重试opid 2/失败时使用默认目标/失败时错误);动作数据包括opid 2接收到的atomicacketh值。这些动作id和动作数据将与默认动作id和默认动作数据进行比较。进一步基于比较,将动作id发送到动作代码,且将动作数据发送到方向动作数据参数。报头和元数据发送到方向数据平面参数。此外,方向数据平面参数和方向动作数据参数发送到动作代码。此动作代码进一步提供报头和元数据作为输出。
129.在不脱离所附权利要求书限定的本发明的范围的情况下,可以对上述本发明实施例进行修改。用于描述和主张本发明的“包括(including)”、“包括(comprising)”、“结合”、“具有”、“为”等表达应以非排他的方式解释,即没有明确描述的项、组件或元素也可存在。对单数的引用也应解释为与复数有关。本文使用的词语“示例性”是指“作为示例、实例或说明”。任何描述为“示例性的”实施例并不一定解释为优于其他实施例和/或并不排除结合来自其他实施例的特征。本文使用的词语“可选地”是指“在一些实施例中提供且在其他实施例中未提供”。应当理解,为了清楚起见而在单独实施例的上下文中描述的本发明的某些特征还可以通过组合提供在单个实施例中。相反地,为了简洁起见而在单个实施例的上下文中描述的本发明的各种特征也可以单独提供或通过任何合适的组合提供或在本发明的任何其他描述的实施例中合适地提供。
当前第1页1  
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
网站地图