大家好,很高兴能够参加Corecom L21的会议那么今天和大家分享的主题是JRPC和RTMA那首先做一个自我介绍我叫张文博,是PinkApp的一名工程师之前的话是给这个LVBPF2s贡献了小货的代码算是回约了一共限制那么这是我的Gate Hub的地址欢迎希望能够与大家有更多的教练那么今天分享的内容的话,主要分成两块块那么一块的话是和RTMA相关主要是介绍一下这个RTMA变成相关的一些概念那么第二部分的话是和介绍一下JRPC的和Core相关的这个体系结构然后以及如果我们将JRPC的这个IO层用RTMA进行替换那么需要做哪些改变然后这里面的一些关键点是什么那我们先来看第一个部分,那么什么是RTMA那么在计算机里为当中,那么RTMA的话呢就是这个前面这四个单词的一个缩写那么就是远端直接内存访问那么它可以直接去访问远端的这个内存那么不需要远端的这个CPU的这样一个参与那么这就可以实现高吞吐和这个DN池那么对于一些这个厌制Mingar的这个缓性的话是一个非常好的一个性能的一个提升那么RTMA的优势的话,主要是有三块第一个的话的话是零口倍那么它不需要像我们使用TCPIP协议站时那么需要将用户,将这个数据那么从用户空间,那么高配到这个内核空间那么它省去了这样一个高配的操作那么第二个的话呢,是它实现了这个Cloud Bypass那么它不再去走这个Legos Snipers这个复杂的这个TCPIP协议站那么就就节约了很多的这个CPU的这样一个计算资源然后一既延迟,那么第三个的话呢,就是CPU offload那么刚才提到了,那么基于这个Bypass的话呢我们可以减去了很多的这个CPU的这个计算那么另外一点的话呢,是这个数据的这个分包拆包的这个过程的话呢,会交给这个网卡做所以就是将这个CPU要做的这个计算的话offload到了这个网卡上那么我们来看一下,和RDMA这个技术相关的一些协议那么RDMA的话呢,它是一个这个技术规范那么实现了这个RDMA技术规范的这个协议的话呢主要是有三种,那么一个的话呢,是这个IB然后另外的话呢,是这个ROCE那么最后一个的话呢,是这个IP那么我们来简单的看一下这三种那么第一种的话呢,它的性能是IB它的性能的话呢,是最好的但是它的花费的话呢,就是比较高因为它和传统的这个以太网并不兼容那么需要,如果我们去使用的时候的话呢那么整个一套网络的这个技术设施那么都需要去用这个IB来做提态那么所以它的这个花费是比较高的那么第二个的话呢,就是ROCE那么它是RDMA在这个以太网上让人各家间歇那么它是目前这个依然是网络以太网络的方案,最高效率的技术方案对,那么它也被称为是IB的这个低成本的技术方案那么第三个的话呢,是这个WRP那么它的话呢,是基于TCP协议的那么它的实现呢,是非常复杂的然后它的这个资源的使用率这个也相当的这个高所以它和这个ROCE相比的话呢,没有什么优势所以用的呢,较上那么再来看一下这个开发者的这个社区那么前面这两个的话呢,主要的话呢,是定义一些规范那么内核社区的话呢,负责在这个内核太的话呢去进行这个RDMA的一些支持那么RDMA社区的话呢,是提供了这样两个项目是我们经常要用到的第一个的话呢,是和RDMA提供了这个RDMA编程所需要的这个库那么尽管我们刚才提到了有三种这个协议但是呢,RDMA编程的时候的话呢,都是同意用的这一套这个API那么RDMA块里面的话呢,它主要是包含了两个主要的库一个的话呢,是RDMA-CM,那么去用于去管理连接那么另外一个的话呢,是用于去操作凤死的后面的话,我会讲什么上两个一个动词那么下面的这个包的话呢,它主要是提供了一些这个安时马克的上一个工具那么敞伤的话呢,主要是这两家,OK那么我们来看一下这个FED那么我们可以看到它提供的这个整个一套这个体系的话呢,还是非常复杂的那么如果我们买了前面这两家任一家的这个网卡的话呢那么他们通常情况下都会提供这个FED的上一个包那么我们去安装它之后的话呢,我们就可以去管理以及使用这个相当的硬价了那么我们来看一下和RDMA变成相关的一些概念那么这块的话呢,主要是分成四块来介绍那么第一块的话呢,是介绍一下它的这个传送模式那么第二块的话呢,是介绍一下RDMA的一些核心概念那么第三个的话呢,是我们来看一下RDMA支持哪些操作那么最后一块的话呢,是介绍一个典型的RDMA程序的一个执行队伍那么我们先来看第一个,第一个的话呢,是reliable connection那么一般点称是RC那么QPR的话呢,它的这个概念的话呢,我们可以等同于一个socket那么在RC模式下呢,那么QPR的话呢,和对端的话呢,是一一应设的那么消息,那么发送到这个PQ的这个发送队列那么在RDMA程序当中的话呢,会可靠的去传递到对端PQ的这个recieu队列那么这里也提一下,那么一个PQ的话呢,它是由两个队列来组成的一个的话呢,就是发送队列,一个就是接收队列然后另外一个特点的话呢,就是包的话呢,它是按照这个顺序来它是可以保证这个按顺序来到它到队端的那么这个RC的连接我们可以看到,它实际上是和PCP的这个连接非常像那么我们在RPC里面使用的时候的话呢,也是使用的这个RC模式后面的和RDMA操作相关的话呢,介绍的也主要是以这个RC来做这个介绍那么第二个的话呢,就是不可靠的这个连接那么不可靠的这个连接的话呢,它也是它的特点的话呢,也是和对端是一对一的那么它的这个连接的话呢,因为它是不可靠的那么所以它的这个包的话呢,是用于丢失的那么在这个传输的过程当中,那么如果出错的话呢,那么底层硬件的话,它不会去重视那么错误处理的话呢,需要由上层自己来做这个处理那么另外一种模式的话呢,就是这个UD那么UD的话呢,它的这个方式的话呢,就比较和这个UDP的这个连接比较像那么它支持这个多哥,那么它的这个顺序是没有办法去这个保证的那么它也容易去产生,那么它也可能会产生这个丢包那么这个的话呢,是一个简单的对比那么我们来看一下这个RDMA的这个核心概念那么我们再,我们先来去看一下一些这个缩列词那么第一个缩列词的话呢,是这个RQ,那么它是这个WQ的简称那么第二的话呢是WQE,那么它是WQElement的这样的一个简称就是放在这个QE里面的这样一个成员那么PQ的话呢,是QPR的一个简称那么我们刚才已经提到了,那么它类似于Socket API里面的这个Socket那么一个这个QPR的话呢,它是由SandQ和ReceiveQ来组成的那么缩写的话呢,就是SQ和RQ那么这个SandQ和ReceiveQ和WQ是一个什么样的关系呢其实它们只是从不同视角上的这个概念上的这个区分那么就是从硬件的这个视角上和这个也就是说从这个驱动的这个视角上和从这个我们使用的这个视角上那么它们实际上本质的话呢,是一样都只带的是同一个事情那么下面的一个的话呢,是share的ReceiveQ那么多个ReceiveQ的话呢,它可以去那么它可以去供小一个来接约,长了一个资源那么这个时候的话呢,我们用到的就是share的ReceiveQ那么和WQQ对应的是这个SQ,也就是完成对列因为RDMA的这个行为的话呢,它都是这个异部的那么一个IPI返回,异部异围的它真正的这个执行官那么只有当一个CQ里面出现了一个这个CQE也就是放在这个CQ里面的这个成员的时候了那么采标志着这个之前执行的这个RDMA的这个清Q完成那么在我们处理这个CQE之前那么我们所使用的这个内存是不能够被这个重新复用的那么WR和这个WC的话呢分别代表着一个WorkRequest那么在RDMA里面的话,每一次操作的话呢,都是一个WorkRequest那么对应的话呢,就是这个Work完成那么我们来看一下这个RDMA的这个动词那么这个RDMA的这个动词的这个Works API API那么它主要包含了两部分,两种类型那么第一种类型的话呢,就是控制路径那么第二个的话呢,就是数据路径那么控制路径的话呢,主要是提供了对这些工作队列的一些增三改查的这样一个接口那么以及包括这个内存的这样一个注册那么数据的这个路径的话呢,是真正的去下发一个WorkRequest或者是去接收一个那个Request然后呢,以及去从这个完成队列里面去pull这个完成事件那么一个标准的这样一个RDMA的这个程序的话呢它需要去连接这个这个库那么才能够去使用这个Works API那么我们来从这个发送的这个角度来看一下那么从发送的这个角度来看一下的话呢那么就是像这个它就是去发起了一个这个SunRequest那么这个SunRequest的话呢,就会进入到这个队列那么一个程序的话呢,它可以有多个这个Request它可以有多个这样的一个工作队列那么每一个工作队列内部的话呢,它是有序的但是多个工作队列之间的话呢,它是无序的那么这块的话呢,也是我们刚才已经呃,强调过的那么一个QP的话呢,它是有这个SunRequest和RequestQ那么来组成的那么来看一下这个QP的Stace那么QP的Stace的话呢,呃,它的这个内部的话呢是一个这个状态机那么我们再去建立连接的时候的话呢是需要去呃,要用这个AI去呃,转换一下他们的这个状态然后来呃,比如说我们表示可以接收了或者是可以发送了但是我们目前在呃,进行这个连接管理的时候呢我们通常不会直接去用这个WorldWords API而是会用这个RDM ACM这个包去进行这个连接管理那么对于这个状态机的这个改变的话呢都隐藏在了这个RDM ACM的这个API里面就我们通常不需要去关注这个状态机的转换呃,那我们再来从这个呃,刚才我们从这个Request的角度来看那么我们再来去从呃,完成的这个角度来看那么呃,一个呃,我们下发了一个Request之后那么这个时候RDM ACM的这个WorldWords API就返回了那么这个时候的话呢,呃,他并没有他并不意味着这个呃,发送的这个操作或者是这个接受的操作,他真正的完成呃,因为RDM ACM他是一个异补的那么所以在这个呃,动作里面所使用的一些资源我们是不能够呃,把它释放或者是呃,重新利用的那么直到我们从呃,完成对列里面去后头了呃,这个Request对应的这个完成事件时那么我们才能够知道呃,我们的这一次请求的这个呃,结果是怎样的并且我们可以对这个资源进行啊,释放或者是重新利用那么我们在处理这个完成的呃,时候的话呢他可能会反馈一些错误那么在这个过程当中那么呃,第一个错误类型的话呢就是呃,立即错误那么这个时候通常情况就是我们去呃,Post一个Request的时候那么我们参数不对那么他反馈的时候就告诉我们,我们的这个请求是无效的那么另外一个的话呢,是这个呃,完成的这个错误那比如说我的这个呃,WQE,那么已经啊,成功的这个下巴但是这个呃,CQE的这个呃,对端的话呢,可能没有及时的这个接收那么最终的话呢,就会导致呃,这边的这个CQE的这个超时那么还有另外一种情况的话呢,就是我的这个呃,请求太多但是呢,我这个CQ,呃,呃,我Post这个CQ的这个速度比较慢那么这个时候的话呢,他就会产生一个CQ Workflow那么对于这个CQ的这个处理的话呢,他呃,也支持两个方式那么一种的话呢,是我们可以拿到CQ的这个FD那么我们把它设置成这个非组色的那么就可以和这个呃,EPO等呃,IODOLOF用的这种机制来呃,使用那么就是以类似中段这种方式那么另外一种方式的话呢,我们也可以去呃,开启一个单独的这个呃,现场我们不停的去从这个呃,CQ里面去论询也是可以的那么我们来看一个呃,数据路径的这样一个呃,数据流动那么在首先的话呢,我们需要在这个呃呃,就是有这样的一个内存区域然后的话呢,我们的这个呃,去调用这个Post散的这样一个Warp API,那么去将这个内存的这个数据的话呢呃,去向硬件进行一个下发那么我们就可以看到会要呃,会就是存这个数据的话呢就从这个呃,Work Queue那么进入到了这个硬件的这个呃,我们刚才提到这个QP的这个散的Q那么我们在这个数据发送过去之后的话呢我们先不要看这个接受端那么我们发送过去之后的话呢那么就会在这个呃,完成对类里面的话呢产生呃,这个相应的这个信息然后呢,这个呃,CQE的这个数据的话呢就会放到这个呃,就代表了这个呃,任务的话我们前面下发的这个Request已经完成那么我们刚刚提到了,我们可以去扣这个CQE那么或者是用这种一破的这个方式那么我们就可以得到一个这样的一破硬的相应事件那么我们就可以从中去赌到它的这个呃,状态那么我们来去决定是呃,要去做一些错误处理那么还是可以去附用我们呃,之前呃,使用的一些这个资源或者是释放呃,那么我们再来看一下这个接收端那么在这个数据呃,从呃,这个呃发送端,呃,发到这个接收端之前的话呢我们需要去下发一个呃,Receive Request那么和这边一样,那么用户太下发的这个Request的话呢它会去放在这个呃,Colonel的这个Receive队列里面那么这个时候的话呢,如果当这个呃,对端有数据发送过来的时候的话呢就可以呃,我们就可以和这个Receive队里面的这个呃,元素的话呢进行一个匹配,因为这里边的话呢高含了一个呃,我接收到的这个数据要放在哪一块内存里面的这个信息那么在这个我们成功的呃,获得了这个把这个接收到的这个数据那么放到了这个目标的存内存上之后的话呢我们同样也会产生这样一个呃,CQE那么和发送一样,那么我们会把它传输到这个传递到这个呃,用户空间那么用户空间的话呢就可以去呃,泡到这个完成事件那么就可以去进行一个相应的处理那么这个流程的话呢是呃,展示的是一个呃,Sand和Receive的这样一个模式那么这里边需要注意一点的是那么如果我们在使用Sand和Receive模式的时候呃,我们必须要先去向这个ReceiveQG下发一些ReceiveRequest那么否则的话呢,发送端发过来的数据那么即使是到达了这个接收端因为他并不知道这个呃,数据应该放在哪那么这个接收端的话呢,也没有地方去这个存储这些呃,去缓存这些数据那么这个过程就会导致一个这个丢包的这个发生那么我们再来去看一下这个内存管理呃,那么内存管理的话呢那么在RGMA重新呃,刚刚建立的时候的话呢我们就可以去做这个内存的这样一个注册那么内存的注册的话呢,它呃嗯,它要去做这种呃,内存的这个保护就是权限管理那么我一块内存呃,我的这个本地访问的权限是怎样的那么远端访问的这个权限是怎样的那么另外一点的话呢,是除了这个权限的这个保护之外的话呢它还要去做这个Memory Pinning呃,那么我们都知道呃,在Legos系统上的话呢这个物理内存的这个分配的话呢,都是延迟的那么我们去调用一个Milok寻求它发挥的是一片这个呃,讯理地址那么只有当你真正去写的时候那么它才会去处理这个缺业中断呃,然后的话呢,去这个去分配实际的物理内存,然后去制定设呃,但是在这里面的话呢它去做了这样一个pin的这样一个操作的话呢就会使得我的这个讯理内存刚刚建立好之后那么就会有呃,相应大小的这个物理内存分配好并与之议设那么也不与这块物理内存也不允许被换出那么它这样做的这个原因是什么呢呃,是因为这个RDMA的这个网卡内部它会维护这样的一个这个呃,DPT表那么简单的理解成就是这个讯理地址和这个物理地址的这样一个议设呃,因为RDMA的话呢它是会从这个它会去直接呃就是这个它会去做这种DMA的这个操作那么不需要所以它不会去访问这个MMU那么所以呃,如果我们的这段内存并没有被pin起来的话那么比如说呃,发生了这种呃,swap的这个行为呢那么也就是说这个物理内存和讯理内存的这个认设发生变化之后那么RDMA网卡是感知不到的那么它在去访问呃,这个物理内存的时候的话呢它访问到的就是一个错误的那么所以在这个地方的话呢它会去把这个呃,内存去把它pin起来那么我们来看一下这个呃,sand和request的这样一个模式那么,那么我们再去post的一个sandrequest的时候那么到达这个接收端那么到达这个接收端之后的话呢在这个接收端的话呢会产生这样一个呃,cqe那么接收端的话呢去post这个cq的话呢就可以知道那么自己从呃,就是我之前去呃,下发的这个呃request的已经呃,完成了那么我们接到了这个对端方送过来的这样一个数据那么呃,接收端或往了这个cq之后的话呢才会去发为这个ack给这个发送端那么这个时候的话呢,发送端的这个呃,cq里面的话呢就产生了这个和sr相关的这样一个呃,完成事件那么它这个时候的话呢就可以通过这个postcq然后去取出它的这个完成事件呃,进行这样一个处理那么我们再来去看一个write那么RDMA的这个write的话呢呃,我们可以发现它并不需要这个receive端那么提前去post的一个RRR那么我们sunder那么想去写这个receiver的这个内存的时候那么它直接去呃,下发一个这个呃,sunder request的那么并且要包含这个呃,数据然后以及呃,这个t,那么这个t的话呢我们就可以简单理解成是访问它的上一个悬线那么就可以实现对远端内存的一个呃,写操作那么之后的话呢,完成写完成之后的话呢它会去返回一个这个ACK给这个发送端那么我们可以看到对于接收端来说呃,那么sunder去写它的这个内存那么对于接收端来说的话呢,它是没有任何感知的那么read的话呢,也是呃,也是同理的那么receiver端的话呢,也是没有任何的这个感知就不需要这个呃,receiver的这个呃,CPU呃,去参与这个啊,数据的这个读写那么同时这个RDMA的这个操作的话呢它也支持呃,这个原刺操作那我们来对比一下这个sunderreceiver和RDMA的read write那么我们从前面的这个流程读我们可以看到那么sunderreceiver呢,它是一个双端的这样一个操作那么它必须呃,成对的出现并且这个postreceiver必须要由早于这个postsunder去发送那么有些时候的话呢,我们并不知道这端啊会去post多少个sunder那么这个时候我们啊,可能要呃去多post的几个这个receiver那么这个时候的话呢,它就会去占用一些这个内存资源那么如果我们不去post的这个足够的这个R那么这个数据的话呢就有可能在这个被接收端去这个丢弃那么原因我们刚才已经提到了所以它并不是一个真正的RDMA操作那么它通常是被用于去传递啊一些这个内存信息或者是在这个啊RDMA通信的过程当中那么去传递一些这个控制的这个信息那么现在对于这个RDMA-CM的这个API那么在呃程序刚刚呃去接立这个连接的时候的话呢就允许去呃写带一些数据给队端那么我们通常情况下是在呃这个地方去进行呃这个内存信息的这样一个交换那么我们也可以看到啊这个sunder和receiver的这个呃操作的话呢实际上我们是可以用这个啊普通的这个呃socket来做这个提换的那么反过来对于VadeRide来说那么它是一个这个单端的这个操作呃它再去读或者是写对端的这个内存的时候呢那么并不需要这个对端的这个CPU的这个参与因因此它特别适合于去呃传输大量的这个啊数据那么我们来看一个免刑的呃这个程序的这个呃流动情况那么呃免刑的这样一个执行流那么第一步的话呢我们就是去获得一个呃应价的一个呃列表的这样一个信息然后我们打开说想要使用的这个设备然后呢去查询一些这个设备的一些呃容量啊等一些这个呃信息然后的话呢会去呃分配一个呃保护域去保护我们这个资源呃那么这个保护域的话呢呃实际上有点类似于这个类似里面的这个呃namespace和这个sigaro对然后的话呢接下来的话呢就是去注册一块这个内存区域别把它拼起来那么这个的话呢也是有一个呃API那么直接就把这些呃固咒的话呢都合在一起了那么接下来的话呢就是去创建一个呃这个完成呃对列然后呢以及去创建一个这个呃QPR然后的话呢去把这个QPR吸起来那么这块的话呢就是对应的这个那么这块的话呢就是对应的一个这个QPR的一个状态机的上要改变那么前面也提到那么如果我们使用的是呃RDMA的这个CM的这个包那么我们是不需要手动去呃对这个状态机进行一个呃修改的呃那么接下来的这个流程的话呢就是我们不断的去呃Pose这个work request那么我们同时也要不停的去Pose这个呃完成的这个对列那么我们知道这个最终通信完成那么我们去进行一些啊行李的这样一个操作那么同时呢呃我们从这个呃RDMA块里面的话呢我们又可以去找到一些这个啊Bunchmark工具那么可以去呃方便我们去对比这个呃这个TCPIP和这个啊基于这种RDMA的这个传输的这个性能的差异呃那么可能呃就是大家想去体验一下这个RDMA的这个编程那么但是呢又没有这个硬件怎么办呢呃那么社区的话呢它提供了一种这个呃soft的ROC的这样的一个机制啊那么就可以让我们在这个呃普通的这个网卡上的话呢也能够去运行这个呃RDMA的程序呃呃当然这种模式的话呢它只是用于去进行开发和一些简单的一些调试那么它的性能的话呢并不好呃不能够用于在这个呃生产那么我们第一部分的话呢就几番介绍完了那么我们再来看一下呃第二部分就是JRPC那么JRPC的话呢呃它是一个这个呃高性能的一个开软的这个呃呃远程过程调用的这样一个方向那我们来看一下这个呃RDMA呃JRPC C-CROP 新的这样一个架构呃那么它的话呢是呃分层做的实际还是非常好那么它最底层的话呢是一个IOW MANAGER然后像上一层的话呢是这个Transpart那么比如说像这个CHDD2那么就是在这个呃层那么在上面的话呢就是呃呃越来越贴近这个用户的这样一个APL那么我们如果要将这个呃RDMA那么进程到这个JRPC里面呢我们主要去关注的层的话呢是这个IOW MANAGER层那么我们如果去做这个基层的话呢我们需要呃首先先要去看一下这个扣里面的这个文档那么这个扣里面的这个文档的话呢它主要是包含了呃两个我们比较关注的一个的话呢是关于这个呃呃JRPC C-CROP的这个呃它的这个事件处理的找一个对列的这个运行的这样机制呃然后另外一个的话呢呃就是和这个呃IOW MANAGER层相关的那么它的这些呃呃PoSight然后以及这个呃PoEvents是怎么样去呃这个工作的那么我们越度完了这些文档之后呢我们就可以去呃对这个IOW MANAGER层进行一些自定义那么JRPC本身的话呢它提供了很多的这个呃可以自定义的这个呃组件那么它同时的话呢也提供了这个example那么我们可以去呃通过学习这些呃example然后来去呃去定义一个呃属于我们自己的这个呃IOW管理层那么对于我们呃来将这个呃RTMA集成到这个JRPC里面的话呢我们重点需要关注的是两个接口那么一个接口的话呢是这个呃tcpclient.h然后另外一个接口的话呢就是tcpceler.h那么和这个呃celer相关的那么我们可以看到它类似于这种面向对象的这个方式那么它是定义了两个VTable那么client的端的话呢呃相对来说是呃比较简单那么它只需要去实现了一个呃connect然后的话呢对于这个呃celer端的话呢它需要去呃定义的这个接口的话呢相对来说要呃很多一点呃那么在这里边的话呢呃有几个呃比较关键的一个点那么第一个的话呢就是呃不要在这个控制路径里面呃不要在这个数据路径里面去用这个控制路径呃因为我们虽然在最刚开始提到那么在这个呃RTMA编程里面那么这个RTMA的话呢它是client bypass的呃但是呢这个只主要指的是这个数据数据路径那么它的这个控制路径的话呢还是要呃陷入到这个内核带的所以我们呃要在呃程序刚初识化的时候那么就去呃将这个呃呃资源的一些呃分配管理呃做好那么第二个的话呢就是呃我们注册了一篇内存之后的话呢我们需要对这篇呃内存的话呢进行个管理那比如说我们去把它去做成这样领一个呃RAM buffer那么第三个的话呢就是我们需要去做一些呃流控那么类似于这个tcp的这个滑动窗口呃这样呃原因的话呢是说呃虽然我们刚才提到了这个我们是用rcm的话呢它是支持重传的但是呢实际上这个呃发生重传的时候那么它的呃这个开销的话呢也是比较高的呃那么最后一个的话呢是呃因为这个cq的话呢我们可以看到那么它只是用于去读取这个cqe所以也就意味着它只能够产生这个啊一波印的这个实践那么所以我们需要去呃就是以我们这个意思我们使用类似于这个cqe的滑动这个窗口那么我们呃每一次在这个epo啊返回之后的话呢我们就需要去呃去check这个窗口的这样一个状态那么呃那么在这个过程当中那么有eccqe的话呢它是用于呃维护呃这个窗口的这些信息的那么这些信息的话呢我们处理完之后那么就呃或者说我们就默默的处理好就可以了那么并不需要向上层去呃报这个qin的这样一个事件那么我们再更新完这个窗口信息之后的话呢我们就根据窗口的信息啊来去呃模拟这个呃epo out的实践就我们去呃根据窗口窗口的这个状态的话呢我们去自己去呃将这个epo的这个法规指示我们改变成说它是epo印还是epo out那么如果那么如果我们上一次这个还有因为这个窗口不满足条件没有办法呃去发送的这个邪情球呢那么这一次在呃或者这个epo out的实践之后的话呢就可以去呃处理上一次的这个延迟系了那么在这个呃将呃RNA集成到g24里面那么主要关注的点的话呢就是RPC好谢谢大家