DPDK--- kni流程梳理和分析

说白了,DPDK中的KNI流程其实非常简单。
主要是解决DPDK在处理一些需要进入内核协议的文件时的效率问题。
首先,我们来谈谈最重要的事情。
KNI 通过发送开销系统调用(例如 copy_to_user() 和 copy_from_user()),使用户模式和内核模式之间的消息处理速度更快。
此外,KNI还增加了兼容性,支持使用普通的网络工具来管理DPDK端口,这比传统的Linux TUN/TAP接口方便得多。

一开始我以为使用KNI会很复杂,但实际上它的流程非常清晰。
KNI用户态主要分为两部分:一部分是librte_kni中的用户代码,另一部分是kernel/linux/kni中的内核代码。
例如,在向核心协议发送数据包的过程中,我们会批量读取dpdk网口数据,并通过rte_kni_tx_burst发送到kni接口。
该过程可以在发送数据文件之前发生。

等等,还有一个。
KNI 分析的示例通常以 main 函数为中心,该函数基于 lcore 函数(例如接收或发送)处理消息。
在用户KNI进程开发模式下,数据会被接收并存储到kni->rx_q队列中,然后释放内存资源。
KNI 内核态负责将这些数据写入网络堆栈。

KNI方法有两种类型:单一投标者和多重投标者。
默认只有匹配,但是关联线程也被关闭。
核心线程会通过kni_net_rx函数处理数据。
这个过程包括从队列中获取数据,将其映射到skb结构,最后将其传递到网络堆栈。

所以,综上所述,KNI是DPDK中提高数据处理性能的关键接口。
KNI通过优化用户态和内核态之间的通信,实现高效的数据传输和内核通信协议。
我认为这是值得的,但请注意,使用 KNI 会增加系统的复杂性,因此请确保您了解整个过程。

vhost前后端(vhost_net/virtio_net)转发流程详解

vhost_net是虚拟化性能优化的关键。
它通过vhost_net_open改进了内核和虚拟机的数据传输。
这主要做了两件事:一是构建vhost_net结构,二是创建vhost_dev和vhost_virtqueue。
简单来说,vhost_poll 处理数据。

关键步骤:首先为TX和RX队列创建vhost_poll;然后,QEMU 使用 ioctl 创建后端 Tapper 来调整数据。
vhost_net_enable_vq 开始接收和发送并连接到套接字。

数据从主机发送到访客。
当接受时,必须检查过滤器和队列长度。
发送时vhost_net_tx_packet处理数据包长度,是发送参数。
接收数据是handle_rx_net的工作。
发送 vhost_net_tx_packet 时,会将数据从 virtioring 复制到 skb,并通过 tun_sendmsg 进入网络堆栈。

vhost_poll_wakeup和vhost_poll_queue是保证数据流动的关键。
它们充当桥梁,确保作业队列和事件得到正确管理。
说到这里,vhost_net的作用和重要性就清晰了。

超猛tuntap虚拟网卡实现超猛UDP隧道

我记得那一次,我坐在电脑前,调试一个网络应用程序,这是一个小型文件传输服务。
我使用的服务器配置了2 5 Gbps的物理网卡,我就在想这个带宽能有多快。
接下来,我开始使用TUN/TAP虚拟网卡模拟UDP隧道流量进行测试。

测试开始了。
您下载了一个大文件。
我看着传输进度条,心想,这个过程需要多快发生?结果,速度并没有达到预期的2 5 Gbps,而只有1 0Gbps左右。
我有些失望,但我没有放弃,不断改正错误。

后来修改了TUN/TAP虚拟网卡的多队列支持,增加了队列数量,改进了内核的拥塞轮询设置。
我再次测试,速度居然提升到了2 0Gbps,这让我很惊讶。

等等,还有一件事,我突然想到,如果我优化UDP协议栈,是不是会更快?我查了一些资料,发现确实还有改进的空间。
于是,我调整了UDP包参数,最终速度接近2 5 Gbps。

这次经历让我明白高性能网络不仅仅是硬件问题,软件优化同样重要。
不过,这也让我很好奇,如果进一步改进,比如采用更先进的网络协议或者更先进的硬件加速技术,速度是否还能进一步提升?