随着vpc网络复杂性以及安全性的需求不断增加,纯软ovs+dpdk的性能已不能满足需要,且需要占用大量cpu核来进行数据转发,性价比低,因此智能网卡卸载已成为一种趋势。
智能网卡硬件同时卸载 OVS 控制面和数据面,利用智能网卡的硬件加速能力,为产品提供极致的性能。
这里先介绍三个概念:代表口、首包上送、硬件卸载。
1)代表口:代表口(representor)是虚拟设备,存在于智能网卡的 SOC 中。Host侧的每个 virtio-net 网卡都有一一对应的代表口,将代表口挂在 OVS 网桥上,即可代表实际的 virtio-net 网卡。对代表口下发流表,同时也对实际的网卡生效。
2)慢速路径:首包上送的的路径,通常被称作慢速路径。初始状态硬件中不存在流表,需要借助首包上送生成流表,再进行流表卸载。Host 侧的网络流量会先进入智能网卡硬件的 eswitch,匹配硬件流表;当匹配失败后,数据包会被送到 SOC 中的代表口上,并进入软件 OVS。软件 OVS 进行 upcall 后,生成 datapath流表,并同时将 datapath 流表转换成硬件流表,卸载到硬件 eswitch 中。首包上送的数据包通过软件 OVS 进行转发。
3) 硬件卸载:匹配硬件流表并转发的路径,通常被称作快速路径。首包上送后,流表被卸载到硬件中;host 侧流量进入硬件 eswitch 后,会匹配到硬件流表,直接进行转发,不会再进入 SOC,以此来达到硬件加速的目的。借助硬件优越的查表和转发能力,即可实现极致网络性能,且不消耗cpu算力。
从软件流程上说:
1)首包以及普通流程:当一个数据包达到网卡后,会调用pmd线程接收数据包,提取miniflow,依次去查找emc、dpctl,如果都miss了,就会执行handle_packet_upcall,查询ofproto流表后执行动作,同时会下发dpctl流表和emc流表。
2)硬件卸载流表:在dp_netdev_flow_add即添加dpctl流表的时候,会创建一个线程同时下发硬件流表。这个时候会将mega_flow转换成rte_flow,最终调用rte_flow_create,将流表卸载到硬件上。与此同时,软件流表还是按照普通的流程去添加。rte_flow_create函数的实现,是在dpdk的pmd驱动中,每家的实现是私有的。
3)硬件流表查询:当网卡硬件流表存在的时候,硬件会查询到流表,直接执行动作,不再经过软件三级流表的查询。
以上就是一个简单的数据流转过程。