searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Memif虚拟IO的实现原理及应用

2023-08-28 06:00:25
318
0

网络应用基于容器化部署越来越多,同一主机上采用不同容器来隔离网络业务,由于当前网络业务采用的基本都是基于DPDK作为数据平面的开发组件进行报文传输,不同的容器之间通过部署不同的DPDK进程来实现各自的业务,为了使得不同容器之间实现通信,所以提供了一种采用内存交换的方式进行报文传输,这种传输接口叫做memif(shared memory packet interface)。Memif传输的报文是原始报文格式,支持配置为Ethernet模式,IP模式,Punt/Inject模式。在VPP(Vector Packet Process)中支持上述三种模式,DPDK只支持Ethernet模式,所以当VPP进程和DPDK进程进行通信时,需要使用Ethernet模式来传输报文。Memif接口有两种身份,master和slave,二者通过unix socket传递控制类消息。Master和slave是一一对应关系,一个master对应一个slave,二者拥有相同的id。其中master负责创建socket连接并监听slave的连接请求,slave负责创建共享内存和初始化共享内存,并主动发起sock连接。

1. Memif基于VPP简单配置

master配置
[root@4cba99d94a68 /]# vppctl
    _______    _        _   _____  ___
 __/ __/ _ \  (_)__    | | / / _ \/ _ \
 _/ _// // / / / _ \   | |/ / ___/ ___/
 /_/ /____(_)_/\___/   |___/_/  /_/

vpp# create interface memif id 0 master
vpp# set interface state memif0/0 up
vpp# set interface ip addr memif0/0 192.168.1.1/24

slave配置
[root@4cba99d94a68 /]# vppctl
    _______    _        _   _____  ___
 __/ __/ _ \  (_)__    | | / / _ \/ _ \
 _/ _// // / / / _ \   | |/ / ___/ ___/
 /_/ /____(_)_/\___/   |___/_/  /_/

vpp# create interface memif id 0 slave
vpp# set interface state memif0/0 up
vpp# set interface ip addr memif0/0 192.168.1.2/24

联通性验证
vpp# ping 192.168.1.1
116 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=32.0338 ms
116 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=32.0211 ms
116 bytes from 192.168.1.1: icmp_seq=4 ttl=64 time=24.6519 ms
116 bytes from 192.168.1.1: icmp_seq=5 ttl=64 time=17.2863 ms

 

2. Memif原理介绍

memif采用unix域套接字来传递控制消息,每组memif在socket里面都有一个唯一的id,这个id也是用来识别对端接口的标识。slave接口在创建的时候,会在指定的socket上尝试连接。socket的监听进程即master接口所在的进程会提取连接请求,并创建一个连接控制信道,并通过此信道发送hello消息,这条消息包含了一些配置信息。slave收到hello消息之后,会根据消息所带的配置来调整自己的配置,随后回复init消息。init消息包含了接口id,监听进程提取接口id,并将控制信道绑定到对应的接口上,之后回复ack。slave收到ack之后就开始创建内存区域(region)和环形队列(ring),并针对每个region和ring都发送一条add消息,master收到后需要逐一回复ack。待slave收到最后一条add ring的ack回复之后,就会发送connect消息,表示slave已经准备就绪。master收到此消息之后,会将region映射到自己的地址空间,初始化ring并回复connected消息,之后就能进行数据报文传输。如果接口状态出现异常,无论是master还是slave,都可以随时发送断开连接请求。

Option Description Default Valid value
id=0 Used to identify peer interface 0 uint32_t
role=server Set memif role client server|client
bsize=1024 Size of single packet buffer 2048 uint16_t
rsize=11 Log2 of ring size. If rsize is 10, actual ring size is 1024 10 1-14
socket=/tmp/memif.sock Socket filename /tmp/memif.sock string len 108
socket-abstract=no Set usage of abstract socket address yes yes|no
owner-uid=1000 Set socket listener owner uid. Only relevant to server with socket-abstract=no unchanged uid_t
owner-gid=1000 Set socket listener owner gid. Only relevant to server with socket-abstract=no unchanged gid_t
mac=01:23:45:ab:cd:ef Mac address 01:23:45:ab:cd:ef  
secret=abc123 Secret is an optional security option, which if specified, must be matched by peer   string len 24
zero-copy=yes Enable/disable zero-copy client mode. Only relevant to client, requires ‘–single-file-segments’ eal argument no yes|no

 

slave非零拷贝 vs slave零拷贝

slave配置成非零拷贝模式时,需要在slave内存空间中单独开辟一块内存区域,slave轮询读取从master发送过来的报文时,需要将报文从region的buffer中拷到memseg当中,slave往master发送报文时,需要先将报文拷贝到region当中,然后由master轮询读取。master去读写报文时,始终都需要内存拷贝。

slave配置成零拷贝模式时,buffers直接在slave的memseg上分配,slave进程直接操作buffer描述符即可,无需额外内存拷贝,只需要master进程读写报文时进行内存拷贝。 

 

3. 总结

优点:

  1. 高性能:memif基于共享内存的通信方式,可以在虚拟机和容器之间实现直接内存访问,从而实现低延迟和高吞吐量的数据传输。它提供了一种高效的网络传输机制,适用于需要处理大量数据的应用场景。

  2. 灵活性:memif接口可用于不同的虚拟化平台和容器化环境,如KVM、Docker、OpenStack等。这使得它成为构建可扩展和灵活网络功能的理想选择。此外,它还支持多个应用程序之间的并发性,可以在同一主机上运行多个虚拟机或容器。

  3. 安全性:memif通过共享内存实现虚拟机和容器之间的数据传输,避免了在物理网络中传输敏感信息的风险。这种机制可以确保数据的机密性和完整性,从而提高系统的安全性。

缺点:

  1. 配置复杂性:由于memif接口能够连接多个应用程序,它的配置可能会比较复杂。需要确保正确配置和管理接口参数,以获得最佳性能和稳定性。

  2. 限制:虽然memif在提供高性能的数据传输方面非常强大,但它可能并不适用于所有场景。在一些特殊情况下,可能需要考虑其他网络接口类型。

0条评论
作者已关闭评论
j****n
2文章数
0粉丝数
j****n
2 文章 | 0 粉丝
j****n
2文章数
0粉丝数
j****n
2 文章 | 0 粉丝
原创

Memif虚拟IO的实现原理及应用

2023-08-28 06:00:25
318
0

网络应用基于容器化部署越来越多,同一主机上采用不同容器来隔离网络业务,由于当前网络业务采用的基本都是基于DPDK作为数据平面的开发组件进行报文传输,不同的容器之间通过部署不同的DPDK进程来实现各自的业务,为了使得不同容器之间实现通信,所以提供了一种采用内存交换的方式进行报文传输,这种传输接口叫做memif(shared memory packet interface)。Memif传输的报文是原始报文格式,支持配置为Ethernet模式,IP模式,Punt/Inject模式。在VPP(Vector Packet Process)中支持上述三种模式,DPDK只支持Ethernet模式,所以当VPP进程和DPDK进程进行通信时,需要使用Ethernet模式来传输报文。Memif接口有两种身份,master和slave,二者通过unix socket传递控制类消息。Master和slave是一一对应关系,一个master对应一个slave,二者拥有相同的id。其中master负责创建socket连接并监听slave的连接请求,slave负责创建共享内存和初始化共享内存,并主动发起sock连接。

1. Memif基于VPP简单配置

master配置
[root@4cba99d94a68 /]# vppctl
    _______    _        _   _____  ___
 __/ __/ _ \  (_)__    | | / / _ \/ _ \
 _/ _// // / / / _ \   | |/ / ___/ ___/
 /_/ /____(_)_/\___/   |___/_/  /_/

vpp# create interface memif id 0 master
vpp# set interface state memif0/0 up
vpp# set interface ip addr memif0/0 192.168.1.1/24

slave配置
[root@4cba99d94a68 /]# vppctl
    _______    _        _   _____  ___
 __/ __/ _ \  (_)__    | | / / _ \/ _ \
 _/ _// // / / / _ \   | |/ / ___/ ___/
 /_/ /____(_)_/\___/   |___/_/  /_/

vpp# create interface memif id 0 slave
vpp# set interface state memif0/0 up
vpp# set interface ip addr memif0/0 192.168.1.2/24

联通性验证
vpp# ping 192.168.1.1
116 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=32.0338 ms
116 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=32.0211 ms
116 bytes from 192.168.1.1: icmp_seq=4 ttl=64 time=24.6519 ms
116 bytes from 192.168.1.1: icmp_seq=5 ttl=64 time=17.2863 ms

 

2. Memif原理介绍

memif采用unix域套接字来传递控制消息,每组memif在socket里面都有一个唯一的id,这个id也是用来识别对端接口的标识。slave接口在创建的时候,会在指定的socket上尝试连接。socket的监听进程即master接口所在的进程会提取连接请求,并创建一个连接控制信道,并通过此信道发送hello消息,这条消息包含了一些配置信息。slave收到hello消息之后,会根据消息所带的配置来调整自己的配置,随后回复init消息。init消息包含了接口id,监听进程提取接口id,并将控制信道绑定到对应的接口上,之后回复ack。slave收到ack之后就开始创建内存区域(region)和环形队列(ring),并针对每个region和ring都发送一条add消息,master收到后需要逐一回复ack。待slave收到最后一条add ring的ack回复之后,就会发送connect消息,表示slave已经准备就绪。master收到此消息之后,会将region映射到自己的地址空间,初始化ring并回复connected消息,之后就能进行数据报文传输。如果接口状态出现异常,无论是master还是slave,都可以随时发送断开连接请求。

Option Description Default Valid value
id=0 Used to identify peer interface 0 uint32_t
role=server Set memif role client server|client
bsize=1024 Size of single packet buffer 2048 uint16_t
rsize=11 Log2 of ring size. If rsize is 10, actual ring size is 1024 10 1-14
socket=/tmp/memif.sock Socket filename /tmp/memif.sock string len 108
socket-abstract=no Set usage of abstract socket address yes yes|no
owner-uid=1000 Set socket listener owner uid. Only relevant to server with socket-abstract=no unchanged uid_t
owner-gid=1000 Set socket listener owner gid. Only relevant to server with socket-abstract=no unchanged gid_t
mac=01:23:45:ab:cd:ef Mac address 01:23:45:ab:cd:ef  
secret=abc123 Secret is an optional security option, which if specified, must be matched by peer   string len 24
zero-copy=yes Enable/disable zero-copy client mode. Only relevant to client, requires ‘–single-file-segments’ eal argument no yes|no

 

slave非零拷贝 vs slave零拷贝

slave配置成非零拷贝模式时,需要在slave内存空间中单独开辟一块内存区域,slave轮询读取从master发送过来的报文时,需要将报文从region的buffer中拷到memseg当中,slave往master发送报文时,需要先将报文拷贝到region当中,然后由master轮询读取。master去读写报文时,始终都需要内存拷贝。

slave配置成零拷贝模式时,buffers直接在slave的memseg上分配,slave进程直接操作buffer描述符即可,无需额外内存拷贝,只需要master进程读写报文时进行内存拷贝。 

 

3. 总结

优点:

  1. 高性能:memif基于共享内存的通信方式,可以在虚拟机和容器之间实现直接内存访问,从而实现低延迟和高吞吐量的数据传输。它提供了一种高效的网络传输机制,适用于需要处理大量数据的应用场景。

  2. 灵活性:memif接口可用于不同的虚拟化平台和容器化环境,如KVM、Docker、OpenStack等。这使得它成为构建可扩展和灵活网络功能的理想选择。此外,它还支持多个应用程序之间的并发性,可以在同一主机上运行多个虚拟机或容器。

  3. 安全性:memif通过共享内存实现虚拟机和容器之间的数据传输,避免了在物理网络中传输敏感信息的风险。这种机制可以确保数据的机密性和完整性,从而提高系统的安全性。

缺点:

  1. 配置复杂性:由于memif接口能够连接多个应用程序,它的配置可能会比较复杂。需要确保正确配置和管理接口参数,以获得最佳性能和稳定性。

  2. 限制:虽然memif在提供高性能的数据传输方面非常强大,但它可能并不适用于所有场景。在一些特殊情况下,可能需要考虑其他网络接口类型。

文章来自个人专栏
容器化网络
1 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0