进程间通信方法、系统、存储介质和计算机设备与流程

文档序号:30135856发布日期:2022-05-21 01:05阅读:76来源:国知局
1.本公开的实施方式涉及计算机
技术领域
:,更具体地,本公开的实施方式涉及进程间通信方法、系统、存储介质和计算机设备。
背景技术
::2.本部分旨在为权利要求中陈述的本公开的实施方式提供背景或上下文,此处的描述不因为包括在本部分中就承认是现有技术。3.目前的进程间通信方式,需要调用内核的网络栈,将待交换的完整数据从发送进程拷贝到内核空间,再从内核空间拷贝到接收进程。进程运行在用户空间,进程间通信过程中,需要用户空间与内核空间之间大量的数据拷贝开销和内核大量的网络栈开销,造成通信速度慢、系统消耗大。技术实现要素:4.本公开的实施方式期望提供一种进程间通信方法、系统、存储介质和计算机设备,能够减少进程间通信所需的数据拷贝开销,并进一步避免内核的网络栈开销,以实现提高进程间通信速度,减少系统消耗。5.根据本公开的一个方面,提供一种进程间通信方法,应用于共享内核的进程,包括:消息发送进程将待发送的数据报文发送至共享内存,并向消息接收进程发送通知报文,所述通知报文携带所述数据报文存储于所述共享内存中的地址信息;所述内核响应于所述通知报文,将所述通知报文传输至所述消息接收进程;所述消息接收进程解析所述通知报文以获得所述地址信息,并根据所述地址信息自所述共享内存中获取所述数据报文。6.在本公开的一示例性实施例中,所述内核中部署有ebpf应用;所述将所述通知报文传输至所述消息接收进程,包括:所述内核在所述消息发送进程与所述消息接收进程之间建立socket连接,生成分别对接所述消息发送进程和所述消息接收进程的socket接口;所述ebpf应用自对接所述消息发送进程的socket接口劫持所述通知报文,并将所述通知报文传输至对接所述消息接收进程的socket接口。7.在本公开的一示例性实施例中,所述内核还生成分别对应所述消息发送进程和所述消息接收进程的socket接口的socket句柄;所述将所述通知报文传输至对接所述消息接收进程的socket接口,包括:解析所述通知报文,获得所述通知报文中包含的接口地址;根据所述接口地址确定目标socket句柄;将所述通知报文传输至所述目标socket句柄对应的目标socket接口,所述目标socket接口为对接所述消息接收进程的socket接口。8.在本公开的一示例性实施例中,每个所述socket句柄中分别存储所述socket连接的本地接口地址和对端接口地址,所述接口地址包括源接口地址和目的接口地址;所述根据所述接口地址确定目标socket句柄,包括:获取以所述目的接口地址为本地接口地址、且以所述源接口地址为对端接口地址的socket句柄,确定为所述目标socket句柄。9.在本公开的一示例性实施例中,所述将所述通知报文传输至所述消息接收进程,包括:在所述消息发送进程与所述消息接收进程之间建立socket连接,生成分别对接所述消息发送进程和所述消息接收进程的socket接口;调用网络协议栈,通过所述网络协议栈将所述通知报文由对接所述消息发送进程的socket接口传输至对接所述消息接收进程的socket接口。10.在本公开的一示例性实施例中,所述地址信息包括所述数据报文存储于所述共享内存中的首地址和所述数据报文的长度。11.在本公开的一示例性实施例中,所述消息发送进程和所述消息接收进程互为业务进程和所述业务进程伴生的sidecar进程。12.根据本公开的一个方面,提供一种进程间通信系统,应用于共享内核的进程,包括:消息发送进程,用于将待发送的的数据报文发送至共享内存,并向消息接收进程发送通知报文,所述通知报文携带所述数据报文存储于所述共享内存中的地址信息;所述内核,用于响应于所述通知报文,将所述通知报文传输至所述消息接收进程;所述消息接收进程,用于解析所述通知报文以获得所述地址信息,并根据所述地址信息自所述共享内存中获取所述数据报文。13.根据本公开的一个方面,提供一种存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时,实现如上述任意实施例所述的进程间通信方法。14.根据本公开的一个方面,提供一种计算机设备,包括:处理器;以及存储器,用于存储所述处理器的可执行指令;其中,所述处理器配置为经由执行所述可执行指令,来执行如上述任意实施例所述的进程间通信方法。15.本公开实施方式的进程间通信方法、系统、存储介质和计算机设备,通过消息发送进程将用于交换的数据存储至共享内存中,使得向消息接收进程发送的请求仅需携带数据存储于共享内存中的地址信息,无需携带完整数据,以减少通信过程中用户空间与内存空间之间的数据拷贝量,从而减少数据拷贝开销;进一步地,还可通过内核中部署的ebpf应用,对socket系统调用进行劫持,使得请求的传递绕过内核的网络栈,通过ebpf应用将请求直接自消息发送进程的socket接口传递至消息接收进程的socket接口,以避免网络栈开销。从而,本公开的进程间通信方案,能够减少数据拷贝开销,并能够进一步避免网络栈开销,实现提高进程间通信速度,减少系统消耗。附图说明16.通过参考附图阅读下文的详细描述,本公开示例性实施方式的上述以及其他目的、特征和优点将变得易于理解。在附图中,以示例性而非限制性的方式示出了本公开的若干实施方式,其中:17.图1示出微服务架构中两个业务进程之间的通信过程示意图;18.图2示出服务网格架构的流量处理过程示意图;19.图3示出服务网格架构中两个业务进程之间的通信过程示意图;20.图4示意性地示出根据本公开一种实施方式的进程间通信方法的流程示意图;21.图5示意性地示出根据本公开一种实施方式的业务进程向sidecar进程发送数据的通信过程示意图;22.图6示意性地示出根据本公开一种实施方式的sidecar进程向业务进程发送数据的通信过程示意图;23.图7示意性地示出根据本公开一种实施方式的内核将通知报文传输至消息接收进程的流程示意图;24.图8示意性地示出根据本公开又一种实施方式的业务进程向sidecar进程发送数据的通信过程示意图;25.图9示意性地示出根据本公开又一种实施方式的sidecar进程向业务进程发送数据的通信过程示意图;26.图10示意性地示出根据本公开一种实施方式的进程间通信系统的模块架构图;27.图11示意性地示出根据本公开一种实施方式的存储介质的示意图;28.图12示意性地示出根据本公开一种实施方式的计算机设备的模块架构图。29.在附图中,相同或对应的标号表示相同或对应的部分。具体实施方式30.下面将参考若干示例性实施方式来描述本公开的原理和精神。应当理解,给出这些实施方式仅仅是为了使本领域技术人员能够更好地理解进而实现本公开,而并非以任何方式限制本公开的范围。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。31.本领域技术人员知道,本公开的实施方式可以实现为一种系统、装置、设备、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:完全的硬件、完全的软件(包括固件、驻留软件、微代码等),或者硬件和软件结合的形式。32.根据本公开的实施方式,提供进程间通信方法、系统、存储介质和计算机设备。33.在本文中,附图中的任何元素数量均用于示例而非限制,以及任何命名都仅用于区分,而不具有任何限制含义。34.下面参考本公开的若干代表性实施方式,详细阐述本公开的原理和精神。35.发明概述36.随着业务的发展,单体架构逐渐向微服务架构转型。在微服务架构中,传统单体软件被拆解为多个高内聚、低耦合的独立模块,每个模块具备独立的服务名称和标识,可以独立部署、扩展(多实例)和更新。多个独立模块之间通过调用来交换数据、完成协作,实现向用户提供服务。每个独立模块被称为一个微服务,运行一个业务进程。37.在微服务架构中,业务进程之间的调用需要通过内核的网络栈实现,且调用过程中数据需要在用户空间和网络空间之间进行多次拷贝。38.图1示出微服务架构中两个业务进程之间的通信过程。参照图1所示,以业务进程x调用业务进程y为例,通信过程包括:第一传输阶段s110,业务进程x发起的请求经socket(套接字)接口、网络栈(具体可以是tcp/ip协议栈)和eth0(以太网)接口,到达容器网络,此过程中请求携带的用于交换的完整数据从业务进程x所在的用户空间拷贝到容器网络所在的内核空间;第二传输阶段s120,请求经过eth0接口、tcp/ip协议栈和socket接口,再从容器网络传输至业务进程y,此过程中完整数据从容器网络所在的内核空间拷贝到业务进程y所在的用户空间。39.其中,tcp/ip协议栈是指遵循tcp/ip(传输控制协议/网际协议)协议簇的网络栈。tcp/ip协议栈的具体结构和通信原理是已知的,本公开对此不再展开说明。此外,容器是通过计算机资源虚拟化技术创建的独立计算单元,可类比于虚拟机,但容器使用的虚拟化技术更加轻量;且与虚拟机相比,容器之间会共享操作系统,资源使用效率更高。40.从图1可知,微服务架构中,两个业务进程之间的通信需要消耗较大的网络栈开销,且完整数据在用户空间与内核空间之间的多次拷贝也会产生较大的数据拷贝开销。而在当下前沿的服务网格架构中,进程间通信会消耗更多的网络栈开销和数据拷贝开销。41.服务网格架构是一种新兴的微服务架构,用于解决多语言微服务架构场景下,服务间相互发现、服务流量治理等一系列问题。在服务网格架构中,每个业务进程都存在一个伴生的sidecar进程,用于代理业务进程的inbound流量和outbound流量。其中,对于一个微服务,访问该微服务的流量被称为inbound流量,即进口流量;该微服务访问其他微服务的流量被称为outbound流量,即出口流量。业务进程的所有inbound流量和outbound流量都会先经由其伴生的sidecar进程代理,再交给业务进程处理。微服务架构中所有的sidecar进程相互连接构成网格状结构,因此称为服务网格架构。42.图2示出服务网格架构的流量处理过程。参照图2所示,微服务x的入口流量inbound1会通过流量重定向技术(例如iptables规则),被重定向到其sidecar进程(标示为sidecar1进程),由sidecar1进程处理之后再发送给微服务x;微服务x访问微服务y的出口流量outbound1会先被重定向到sidecar1进程,由sidecar1进程处理之后再发送至微服务y。同理,微服务y的入口流量inbound2会被重定向到微服务y的sidecar进程(标示为sidecar2进程),由sidecar2进程处理之后再发送给微服务y;微服务y的出口流量outbound2也会先被重定向到sidecar2进程,由sidecar2进程处理之后再发送至目标业务进程。43.通过sidecar进程来代理业务进程的进出口流量,能够实现将业务逻辑无关的功能如服务发现、限流熔断等流量治理能力、tracing/log等流量观察能力都剥离到sidecar进程中,由sidecar进程进行处理。44.从图2可知,服务网格架构虽然实现了业务逻辑和流量治理的剥离,但是也会由于增加了业务进程与sidecar进程之间的通信过程,而带来额外的性能开销。45.图3示出服务网格架构中两个业务进程之间的通信过程。参照图3所示,以业务进程x调用业务进程y为例,通信过程包括:第一传输阶段s210,业务进程x发起的请求经socket接口和tcp/ip协议栈,到达业务进程x与伴生的sidecar1进程之间的io接口,此过程中请求携带的用于交换的完整数据从用户空间拷贝到内核空间;第二传输阶段s220,请求经过tcp/ip协议栈和socket接口到达sidecar1进程,由sidecar1进程进行流量治理等操作后,再将请求经socket接口、tcp/ip协议栈和eth0接口传输到容器网络,此过程中完整数据先从内核空间拷贝到用户空间,再从用户空间拷贝到内核空间;第三传输阶段s230,请求经eth0接口、tcp/ip协议栈和socket接口,从容器网络传输到业务进程y伴生的sidecar2进程,由sidecar2进程进行流量治理等操作后,再将请求经socket接口和tcp/ip协议栈传输到sidecar2进程与业务进程y之间的io接口,此过程中完整数据先从内核空间拷贝到用户空间,再从用户空间拷贝到内核空间;第四传输阶段s240,请求经tcp/ip协议栈和socket接口,最终到达业务进程y,此过程中完整数据从内核空间拷贝到用户空间。46.从图3可知,在服务网格架构中,业务进程x与业务进程y之间的调用增加了第二传输阶段s220和第三传输阶段s230的整整两跳,造成的网络栈开销和数据拷贝开销都成倍增长。47.为此,需要一种新的进程间通信方案,以克服上述的进程间通信方式存在的数据拷贝开销和网络栈开销大的问题。48.本公开的发明人发现,在上述的进程间通信过程中,主要涉及到数据交换和事件通知。数据交换是指进程之间交换请求/响应数据,上述的进程间通信方式中,通过完整数据拷贝的方式来实现进程之间交换数据;事件通知是指通过网络调用来驱动进程处理数据,上述的进程间通信方式中,通过socket网络通信,调用tcp/ip协议栈来通知相关的进程接收并处理数据。对于共享内核的进程而言,进程间通信过程中大量的数据拷贝开销和网络栈开销实际上是可以避免的。例如,在服务网格架构下,业务进程和sidecar进程都部署于同一主机内并共享内核的网络栈,则可以利用同一主机的环境,来避免大量数据在用户空间和内核空间之间的拷贝,以减少数据拷贝开销;此外,由于共享网络栈,若能通过相关技术手段绕过网络栈进行事件通知,则可避免网络栈开销。49.鉴于上述内容,本公开的基本思想在于:通过共享内存机制,使进程间通信过程中,消息发送进程将用于交换的数据存储至共享内存中,从而向消息接收进程发送的通知报文仅需携带数据报文存储于共享内存中的地址信息,而无需携带完整数据,以减少通信过程中用户空间与内存空间之间的数据拷贝量,减少数据拷贝开销;进一步地,还可通过ebpf劫持机制,对socket系统调用进行劫持,使进程间通信过程中,通知报文的传递绕过内核的网络栈,直接从消息发送进程的socket接口传递至消息接收进程的socket接口,以避免网络栈开销。从而,本公开的进程间通信方案,通过共享内存机制和ebpf劫持机制分别实现进程间通信过程中的数据交换和事件通知,能够减少数据拷贝开销并避免网络栈开销,提高进程间通信速度,减少系统消耗;尤其是在服务网格架构下,能够在保证对业务进程和sidecar进程保持低侵入的同时,最大限度地降低无效的数据拷贝开销和网络栈开销,实现服务网格架构的网络传输加速。50.在介绍了本公开的基本原理之后,下面结合附图具体介绍本公开的各种非限制性实施方式。51.示例性方法52.下面结合图4来描述根据本公开示例性实施方式的进程间通信方法。本实施方式的进程间通信方法应用于共享内核的进程,参照图4所示,进程间通信方法可以包括以下步骤:53.s310,消息发送进程将待发送的数据报文发送至共享内存,并向消息接收进程发送通知报文,通知报文携带数据报文存储于共享内存中的地址信息。54.消息发送进程与消息接收进程位于用户空间,消息发送进程与消息接收进程共享内核。在发送数据之前,消息发送进程可向内核申请共享内存,共享内存放在用户空间进行管理。数据报文是用于交换的数据,消息发送进程将用于交换的数据存储至共享内存中,从而向消息接收进程发送的通知报文仅需携带数据报文存储于共享内存中的地址信息,而无需携带完整数据。55.s320,内核响应于通知报文,将通知报文传输至消息接收进程。56.通知报文仅携带数据报文存储于共享内存中的地址信息,相比于完整数据大大减少了数据量。从而,通知报文自消息发送进程传输到内核,再自内核传输到消息接收进程的过程中,用户空间与内核空间之间的数据拷贝量大大减少,有效降低数据拷贝开销。57.s330,消息接收进程解析通知报文以获得地址信息,并根据地址信息自共享内存中获取数据报文。58.消息接收进程获得通知报文后,从中解析出地址信息,即可获知数据报文存储于共享内存中的位置,从而可自共享内存中获取对应的数据报文,进行处理。59.从而,本公开的上述实施方式的进程间通信方法,能够通过共享内存机制,使进程间通信过程中,消息发送进程将用于交换的数据存储至共享内存中,而向消息接收进程发送的通知报文仅需携带数据报文存储于共享内存中的地址信息,无需携带完整数据,以减少通信过程中用户空间与内存空间之间的数据拷贝量,减少数据拷贝开销。60.在本公开的一示例性实施例中,地址信息包括数据报文存储于共享内存中的首地址和数据报文的长度。从而,消息接收进程能够根据通知报文所携带的首地址和长度等信息,方便、准确地从共享内存中获取到对应的数据报文。61.在本公开的一示例性实施例中,内核采用socket网络通信,调用网络栈实现事件通知。具体来说,内核将通知报文传输至消息接收进程的过程可包括:在消息发送进程与消息接收进程之间建立socket连接,生成分别对接消息发送进程和消息接收进程的socket接口;调用网络协议栈,通过网络协议栈将通知报文由对接消息发送进程的socket接口传输至对接消息接收进程的socket接口。62.本示例中的网络协议栈可以是tcp/ip协议栈,或者是遵循其他通信协议的网络栈。各网络栈的具体结构和通信原理是已知的,因此不再展开说明。63.在本公开的一示例性实施例中,消息发送进程和消息接收进程互为业务进程和业务进程伴生的sidecar进程。也即,本示例中,进程间通信方法应用于服务网格架构,针对业务进程与sidecar进程之间的数据交换需求,基于共享内存机制减少用户空间与内核空间之间的数据拷贝开销。在其他示例中,进程间通信方法也可应用于任意共享内核的进程之间。64.图5示出根据本公开一种实施方式的业务进程向sidecar进程发送数据的通信过程。本实施例中各过程步骤的特征和原理可参见上述任意实施例所描述的进程间通信方法,上述任意实施例的进程间通信方法的特征和原理均可应用至本实施例中。对于相同的特征和原理,不再重复说明。参照图5所示,业务进程410与其伴生的sidecar进程420部署于同一主机/pod(部署点),并共享同一内核430。业务进程410发送数据到sidecar进程420的通信过程包括:65.首先,业务进程410将数据报文发送至共享内存440,并向sidecar进程420发送通知报文,以通知sidecar进程420有新数据需要处理。通知报文中携带数据报文存储于共享内存440中的首地址和报文长度等信息。66.对于业务进程410,需要对其sdk(softwaredevelopmentkit,软件开发工具包)或网络框架进行少量修改,以实现数据发送逻辑的修改,使业务进程410能够将数据报文存储至共享内存440中,并向sidecar进程420发送通知报文。业务进程410的网络架构具体可包括用于按照业务逻辑处理数据的业务处理模块和用于收发数据的网络处理模块。业务进程410发送数据报文和通知报文的行为,即通过其网络处理模块实现。67.其次,内核430接收到通知报文,采用socket网络通信,在业务进程410与sidecar进程420之间建立socket连接,并调用tcp/ip协议栈进行事件通知。通知报文自业务进程410传输至sidecar进程420的通信链路具体包括:对接业务进程410的socket接口→tcp/ip协议栈→业务进程410与sidecar进程420之间的io接口→tcp/ip协议栈→对接sidecar进程420的socket接口。68.由于通知报文仅携带数据报文存储于共享内存440中的地址信息,相比于完整数据大大减少了数据量,从而在通知报文自业务进程410传输至sidecar进程420的过程中,用户空间与内核空间之间的数据拷贝量大大减少,有效降低了数据拷贝开销。69.最后,sidecar进程420获取到事件通知,从中解析出有关数据报文的首地址和报文长度等信息,即可自共享内存440中获取对应的数据报文,进行流量治理、路由转发等处理。70.sidecar进程420可使用一个高性能的网络代理来实现,例如可使用envoy作为sidecar进程420。envoy是目前使用最广泛的一种网络代理,在istio架构、awsmesh架构、openservicemesh架构等微服务架构中,几乎都使用envoy作为数据面的sidecar进程。本示例即以envoy作为sidecar进程420进行说明;在其他示例中,sidecar进程也可使用其他网络代理。71.对于由envoy实现的sidecar进程420,可以使用envoy本身提供的networkfilter(网络过滤器)来无侵入地实现共享内存的相关逻辑。sidecar进程420可使用networkfilter来收发数据,并通过流量治理模块实现流量治理等处理逻辑。72.上述的服务网格架构中业务进程向sidecar进程发送数据的通信过程,通过共享内存机制,使进程间通信过程中,业务进程将用于交换的数据存储至共享内存中,向sidecar进程发送的通知报文仅携带数据报文存储于共享内存中的地址信息,无需携带完整数据,从而减少通信过程中用户空间与内存空间之间的数据拷贝量,减少数据拷贝开销,实现在保证对业务进程和sidecar进程保持低侵入的同时,有效地降低无效的数据拷贝开销,实现服务网格架构的网络传输加速。73.图6示出根据本公开一种实施方式的sidecar进程向业务进程发送数据的通信过程。本实施例中各过程步骤的特征和原理可参见上述任意实施例所描述的进程间通信方法,上述任意实施例的进程间通信方法的特征和原理均可应用至本实施例中。对于相同的特征和原理,不再重复说明。参照图6所示,sidecar进程420’与其所伴生的业务进程410’部署于同一主机/pod,并共享同一内核430’。sidecar进程420’发送数据到业务进程410’的通信过程包括:74.首先,sidecar进程420’将数据报文发送至共享内存440’,并向业务进程410’发送通知报文,以通知业务进程410’有新数据需要处理。75.本示例中,sidecar进程420’可使用envoy网络代理来实现。在其他示例中,sidecar进程420’也可使用其他网络代理。对于由envoy实现的sidecar进程420’,可以使用envoy本身提供的networkfilter来无侵入地实现共享内存的相关逻辑。sidecar进程420’可使用networkfilter来收发数据,并通过流量治理模块实现流量治理等处理逻辑。76.其次,内核430’接收到通知报文,采用socket网络通信,在sidecar进程420’与业务进程410’之间建立socket连接,调用tcp/ip协议栈进行事件通知。通知报文自sidecar进程420’传输到业务进程410’的通信链路具体包括:对接sidecar进程420’的socket接口→tcp/ip协议栈→sidecar进程420’与业务进程410’之间的io接口→tcp/ip协议栈→对接业务进程410’的socket接口。77.由于通知报文仅携带数据报文存储于共享内存440’中的地址信息,相比于完整数据大大减少了数据量,从而在通知报文自sidecar进程420’传输至业务进程410’的过程中,用户空间与内核空间之间的数据拷贝量大大减少,有效降低了数据拷贝开销。78.最后,业务进程410’获取到事件通知,从中解析出有关数据报文的首地址和报文长度等信息,即可自共享内存440’中获取对应的数据报文,进行业务逻辑处理。79.业务进程410’的sdk或网络框架经过少量修改,能够实现基于共享内存的数据接收逻辑,使得业务进程410’能够根据通知报文携带的地址信息,自共享内存440’中获取到对应的数据报文进行处理。业务进程410’的网络架构具体可包括用于按照业务逻辑处理数据的业务处理模块和用于收发数据的网络处理模块。80.上述的服务网格架构中sidecar进程向业务进程发送数据的通信过程,通过共享内存机制,使sidecar进程与业务进程在通信过程中,sidecar进程将用于交换的数据存储至共享内存中,向业务进程发送的通知报文仅需携带数据报文存储于共享内存中的地址信息,无需携带完整数据,从而减少通信过程中用户空间与内存空间之间的数据拷贝量,减少数据拷贝开销,实现在保证对sidecar进程和业务进程保持低侵入的同时,有效地降低无效的数据拷贝开销,实现服务网格架构的网络传输加速。81.需要说明的是,图5和图6示意出了服务网格架构中业务进程与其伴生的sidecar进程之间的通信过程。在其他示例中,上述的进程间通信方法也可适用于服务网格架构中的两个sidecar进程之间,或者其他任意共享内核的进程之间。82.在上述的进程间通信方法中,进程间通信的事件通知机制仍采用微服务架构中传统的socket网络通信方式。即,消息发送进程与消息接收进程之间交互时,基于socket连接,通过socket系统调用,来调用内核的网络栈实现事件通知。上述的方案能够大大减少进程间通信过程中,内核空间与用户空间之间的数据拷贝开销;但是,由于事件通知仍旧通过socket系统调用传递,因此仍旧存在网络栈本身的软件开销。83.本公开的下述实施方式中,将进一步通过ebpf劫持机制,对socket系统调用进行劫持,通过将消息发送进程与消息接收进程的一对socket接口建立映射关系,直接在两个socket接口之间进行数据交换,绕过内核的网络栈,避免网络栈本身的软件开销。84.图7示出根据本公开一种实施方式的内核将通知报文传输至消息接收进程的过程,参照图7所示,在本公开的一示例性实施例中,内核将通知报文传输至消息接收进程,可以包括如下步骤:85.s510,内核在消息发送进程与消息接收进程之间建立socket连接,生成分别对接消息发送进程和消息接收进程的socket接口;s520,ebpf应用自对接消息发送进程的socket接口劫持通知报文,并将通知报文传输至对接消息接收进程的socket接口。86.其中,ebpf(extendedberkeleypacketfilter)应用是部署在内核中的一小段程序,能够实现内核中网络包的处理和转发。通过ebpf应用,能够自消息发送进程的socket接口劫持通知报文,直接传递至消息接收进程的socket接口,从而绕开内核的网络栈,避免网络栈开销。87.在本公开的一示例性实施例中,内核在建立socket连接时,还生成分别对应消息发送进程和消息接收进程的socket接口的socket句柄(也即文件描述符fd,filedescriptor);ebpf应用将通知报文传输至对接消息接收进程的socket接口,可以包括:解析通知报文,获得通知报文中包含的接口地址;根据接口地址确定目标socket句柄;将通知报文传输至目标socket句柄对应的目标socket接口,目标socket接口为对接消息接收进程的socket接口。88.每个socket句柄中,分别存储socket连接的本地接口地址和对端接口地址。具体来说,消息发送进程的socket句柄中,以消息发送进程的socket接口的地址为本地接口地址、以消息接收进程的socket接口的地址为对端接口地址;消息接收进程的socket句柄中,则以消息接收进程的socket接口的地址为本地接口地址、并以消息发送进程的socket接口的地址为对端接口地址。89.通知报文中包含的接口地址,包括源接口地址和目的接口地址。源接口地址是指发送通知报文的进程的接口地址,也即消息发送进程的socket接口的地址;目的接口地址是指接收通知报文的进程的接口地址,也即消息接收进程的socket接口的地址。90.ebpf应用根据通知报文中包含的接口地址确定目标socket句柄,可以包括:获取以目的接口地址为本地接口地址、且以源接口地址为对端接口地址的socket句柄,确定为目标socket句柄。本示例中,消息接收进程的socket句柄中,所存储的本地接口地址也即通知报文中包含的目的接口地址、所存储的对端接口地址也即通知报文中包含的源接口地址,从而消息接收进程的socket句柄被确定为目标socket句柄。91.上述的通知报文传输过程,在消息发送进程与消息接收进程之间建立socket连接后,在连接发起方,即消息发送进程一侧,以本地接口地址和对端接口地址为key存储自身socketfd;且在连接接收方,即消息接收进程一侧,也以对应的本地接口地址和对端接口地址为key存储自身soeketfd,从而在ebpf应用中留下两条socketfd记录。当消息发送进程与消息接收进程之间通过socket连接交换数据时,数据包会被ebpf应用劫持,并以数据包中的源接口地址和目的接口地址为key,搜索socketfd记录,找到目标socketfd将数据包直接写入其中,实现绕过内核的网络栈,有效避免网络栈开销。尤其是对于服务网格架构中,两个业务进程之间交互需要经过各自伴生的sidecar进程的情形,能够有效克服由于增加sidecar进程而导致的网络栈开销成倍增长的问题,实现服务网格架构的网络传输加速,极大降低系统消耗。92.下面以服务网格架构中,业务进程与其伴生的sidecar进程之间,基于共享内存机制和ebpf劫持机制进行通信的过程。需要说明的是,下述实施方式仅以业务进程与其伴生的sidecar进程为例进行说明;在其他示例中,下述的进程间通信方法也可适用于服务网格架构中的两个sidecar进程之间,或者其他任意共享内核的进程之间。此外,上述实施例的进程间通信方法的特征和原理均可应用至下述的实施例中,在下述实施例中,对于相同的特征和原理不再重复说明。93.图8示出根据本公开一种实施方式的业务进程向sidecar进程发送数据的通信过程,参照图8所示,业务进程610与其伴生的sidecar进程620部署于同一主机/pod,并共享同一内核630。业务进程610发送数据到sidecar进程620的通信过程包括:94.首先,业务进程610将数据报文发送至共享内存640,并向sidecar进程620发送通知报文,以通知sidecar进程620有新数据需要处理。95.业务进程610的sdk或网络框架经过少量修改,能够实现将待交换的数据存储至共享内存640中,并向sidecar进程620发送通知报文。业务进程610的网络架构具体可包括用于按照业务逻辑处理数据的业务处理模块和用于收发数据的网络处理模块。96.其次,内核630接收到通知报文,在业务进程610与sidecar进程620之间建立socket连接;此时,内核630中部署的ebpf应用会自业务进程610的socket接口劫持通知报文,直接传递至sidecar进程620的socket接口。从而,相比于图5所示的通知报文传输过程,本示例中通知报文的传输绕过了内核630的网络栈,通过ebpf劫持实现了通知报文直接自对接业务进程610的socket接口传递至对接sidecar进程620的socket接口,从而避免网络栈开销。97.此外,由于通知报文仅携带数据报文存储于共享内存640中的地址信息,相比于完整数据大大减少了数据量,从而在通知报文自业务进程610传输至sidecar进程620的过程中,用户空间与内核空间之间的数据拷贝量大大减少,有效降低了数据拷贝开销。98.最后,sidecar进程620获取到事件通知,从中解析出有关数据报文的首地址和报文长度等信息,即可自共享内存640中获取对应的数据报文,进行流量治理、路由转发等处理。99.sidecar进程620可使用envoy等高性能的网络代理来实现。对于由envoy实现的sidecar进程620,可以使用envoy本身提供的networkfilter无侵入地实现共享内存的相关逻辑。sidecar进程620可使用networkfilter来收发数据,并通过流量治理模块进行流量治理等处理。100.上述的服务网格架构中业务进程向sidecar进程发送数据的通信过程,通过共享内存机制,使业务进程与sidecar进程的通信过程中,用户空间与内存空间之间的数据拷贝量大大减少,并通过ebpf劫持机制,绕过内核的网络栈实现事件通知;从而,能够实现在保证对业务进程和sidecar进程保持低侵入的同时,有效地降低无效的数据拷贝开销和内核网络栈开销,实现服务网格架构的网络传输加速,减少系统消耗。101.图9示出根据本公开一种实施方式的sidecar进程向业务进程发送数据的通信过程,参照图9所示,sidecar进程620’与其所伴生的业务进程610’同样部署于同一主机/pod,并共享同一内核630’。sidecar进程620’发送数据到业务进程610’的通信过程包括:102.首先,sidecar进程620’将数据报文发送至共享内存640’,并向业务进程610’发送通知报文,以通知业务进程610’有新数据需要处理。103.sidecar进程620’可使用envoy等高性能的网络代理来实现。对于由envoy实现的sidecar进程620’,可使用envoy本身提供的networkfilter无侵入地实现共享内存的相关逻辑,进行收发数据,且sidecar进程620’可通过流量治理模块实现流量治理等处理逻辑。104.其次,内核630’接收到通知报文,在sidecar进程620’与业务进程610’之间建立socket连接;此时,内核630’中部署的ebpf应用会自sidecar进程620’的socket接口劫持通知报文,直接传递至业务进程610’的socket接口。从而,相比于图6所示的通知报文传输过程,本示例中通知报文的传输绕过了内核630’的网络栈,通过ebpf劫持实现了通知报文直接自对接sidecar进程620’的socket接口传递至对接业务进程610’的socket接口,从而避免网络栈开销。105.此外,由于通知报文仅携带数据报文存储于共享内存640’中的地址信息,相比于完整数据大大减少了数据量,从而在通知报文自sidecar进程620’传输至业务进程610’的过程中,用户空间与内核空间之间的数据拷贝量大大减少,有效降低了数据拷贝开销。106.最后,业务进程610’获取到事件通知,从中解析出有关数据报文的首地址和报文长度等信息,即可自共享内存640’中获取对应的数据报文,进行业务逻辑处理。107.业务进程610’的sdk或网络框架经过少量修改,能够实现基于共享内存的数据接收逻辑,即根据通知报文携带的地址信息自共享内存640’中获取到对应的数据报文。业务进程610’的网络架构具体可包括用于按照业务逻辑处理数据的业务处理模块和用于收发数据的网络处理模块。108.上述的服务网格架构中sidecar进程向业务进程发送数据的通信过程,通过共享内存机制,使sidecar进程与业务进程的通信过程中,用户空间与内存空间之间的数据拷贝量大大减少,并通过ebpf劫持机制,绕过内核的网络栈实现事件通知;从而,能够实现在保证对业务进程和sidecar进程保持低侵入的同时,有效地降低无效的数据拷贝开销和内核网络栈开销,实现服务网格架构的网络传输加速,减少系统消耗。109.示例性装置110.在介绍了本公开示例性实施方式的进程间通信方法之后,下文中将结合图10对本公开示例性实施方式的进程间通信系统进行描述。111.本公开实施例提供的进程间通信系统,应用于共享内核的进程,可用于实现上述对应实施例描述的进程间通信方法。上述任意实施例描述的进程间通信方法的特征和原理均可应用至下面对应的进程间通信系统实施例。在下面的进程间通信系统实施例中,对已经阐明的关于进程间通信的特征和原理不再重复说明。112.参照图10所示,本公开示例性实施方式的进程间通信系统700可以包括消息发送进程710、内核730和消息接收进程720。消息发送进程710可用于将待发送的的数据报文发送至共享内存,并向消息接收进程720发送通知报文,通知报文携带数据报文存储于共享内存中的地址信息;内核730可用于响应于通知报文,将通知报文传输至消息接收进程;消息接收进程720可用于解析通知报文以获得地址信息,并根据地址信息自共享内存中获取数据报文。113.从而,上述的进程间通信系统700,通过共享内存机制,使消息发送进程与消息接收进程在通信过程中,用户空间与内存空间之间的数据拷贝量大大减少,以减少数据拷贝开销,实现网络传输加速。尤其是对于服务网格架构,能够实现在保证对业务进程和sidecar进程保持低侵入的同时,有效地降低无效的数据拷贝开销和内核网络栈开销,实现服务网格架构的网络传输加速,减少系统消耗。114.根据本公开示例性实施例,内核中用于将通知报文传输至消息接收进程的模块可以包括:连接建立模块,用于在消息发送进程与消息接收进程之间建立socket连接,生成分别对接消息发送进程和消息接收进程的socket接口;ebpf模块,用于自对接消息发送进程的socket接口劫持通知报文,并将通知报文传输至对接消息接收进程的socket接口。115.根据本公开示例性实施例,连接建立模块还用于生成分别对应消息发送进程和消息接收进程的socket接口的socket句柄;ebpf模块中,用于将通知报文传输至对接消息接收进程的socket接口的模块可以包括:报文解析模块,用于解析通知报文,获得通知报文中包含的接口地址;目标确定模块,用于根据接口地址确定目标socket句柄;报文传输模块,用于将通知报文传输至目标socket句柄对应的目标socket接口,目标socket接口为对接消息接收进程的socket接口。116.根据本公开示例性实施例,每个socket句柄中分别存储socket连接的本地接口地址和对端接口地址,接口地址包括源接口地址和目的接口地址;目标确定模块,可用于获取以目的接口地址为本地接口地址、且以源接口地址为对端接口地址的socket句柄,确定为目标socket句柄。117.根据本公开示例性实施例,内核中用于将通知报文传输至消息接收进程的模块可以包括:连接建立模块,用于在消息发送进程与消息接收进程之间建立socket连接,生成分别对接消息发送进程和消息接收进程的socket接口;网络栈调用模块,用于调用网络协议栈,通过网络协议栈将通知报文由对接消息发送进程的socket接口传输至对接消息接收进程的socket接口。118.根据本公开示例性实施例,地址信息可以包括数据报文存储于共享内存中的首地址和数据报文的长度。119.根据本公开示例性实施例,消息发送进程和消息接收进程互为业务进程和业务进程伴生的sidecar进程。120.本公开上述实施方式的进程间通信系统的各个功能模块与本公开上述实施方式中已详细描述的进程间通信方法的原理和特征相同,因此,各个功能模块的具体特征和原理可参照上述各进程间通信方法实施例的描述,此处不再重复说明。121.综上,本公开示例性实施方式提供的进程间通信系统,能够通过共享内存机制,使进程间通信过程中,用户空间与内存空间之间的数据拷贝量大大减少,以减少数据拷贝开销,并通过ebpf劫持机制,绕过内核的网络栈实现事件通知,以避免网络栈开销;尤其是对于服务网格架构,能够实现在保证对业务进程和sidecar进程保持低侵入的同时,有效地降低无效的数据拷贝开销和内核网络栈开销,实现服务网格架构的网络传输加速,减少系统消耗。122.示例性存储介质123.在介绍了本公开示例性实施方式的进程间通信方法和系统之后,接下来,参照图11对本公开示例性实施方式的存储介质进行说明。124.参照图11所示,描述了根据本公开的实施方式的用于实现上述的进程间通信方法的存储介质800,其可以采用便携式紧凑盘只读存储器(cd-rom)且包括程序代码,并可以在设备,例如个人电脑上运行。然而,本公开的存储介质不限于此,在本文件中,存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。125.存储介质可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以为但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。126.可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。127.可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、rf等等,或者上述的任意合适的组合。128.可以以一种或多种程序设计语言的任意组合来编写用于执行本公开操作的程序代码,所述程序设计语言包括面向对象的程序设计语言,如java、c++等,还包括常规的过程式程序设计语言,如“c”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(lan)或广域网(wan),连接到用户计算设备,或者,可以连接到外部计算设备(例如利用因特网服务提供商来通过因特网连接)。129.示例性计算机设备130.在介绍了本公开示例性实施方式的存储介质之后,接下来,参照图12对本公开示例性实施方式的计算机设备进行说明。131.图12显示的计算机设备900仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。132.如图12所示,计算机设备900以通用计算设备的形式表现。计算机设备900的组件可以包括但不限于:上述至少一个处理单元910、上述至少一个存储单元920、连接不同系统组件(包括存储单元920和处理单元910)的总线930、显示单元940。133.其中,存储单元存储有程序代码,程序代码可以被处理单元910执行,使得处理单元910执行本说明书上述示例性方法部分描述的根据本公开各种示例性实施方式的进程间通信方法的步骤。134.存储单元920可以包括易失性存储单元,例如随机存取存储单元(ram)9201和/或高速缓存存储单元9202,还可以进一步包括只读存储单元(rom)9203。135.存储单元920还可以包括具有一组(至少一个)程序模块9205的程序/实用工具9204,这样的程序模块9205包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。136.总线930可以包括数据总线、地址总线和控制总线。137.计算机设备900也可以与一个或多个外部设备(例如键盘、指向设备、蓝牙设备等)通信,这种通信可以通过输入/输出(i/o)接口950进行。计算机设备900还包括显示单元940,其连接到输入/输出(i/o)接口950,用于进行显示。并且,计算机设备900还可以通过网络适配器960与一个或者多个网络(例如局域网(lan),广域网(wan)和/或公共网络,例如因特网)通信。如图所示,网络适配器960通过总线930与计算机设备900的其它模块通信。应当明白,尽管图中未示出,可以结合计算机设备900使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、raid系统、磁带驱动器以及数据备份存储系统等。138.应当注意,尽管在上文详细描述中提及了进程间通信系统的若干模块或子模块,但是这种划分仅仅是示例性的并非强制性的。实际上,根据本公开的实施方式,上文描述的两个或更多单元/模块的特征和功能可以在一个单元/模块中具体化。反之,上文描述的一个单元/模块的特征和功能可以进一步划分为由多个单元/模块来具体化。139.此外,尽管在附图中以特定顺序描述了本公开方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。140.虽然已经参考若干具体实施方式描述了本公开的精神和原理,但是应该理解,本公开并不限于所公开的具体实施方式,对各方面的划分也不意味着这些方面中的特征不能组合以进行受益,这种划分仅是为了表述的方便。本公开旨在涵盖所附权利要求的精神和范围内所包括的各种修改和等同布置。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1