前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DPDK KNI的几个问题解决和后续发展

DPDK KNI的几个问题解决和后续发展

原创
作者头像
yateszhou
修改2021-02-20 20:48:24
3.5K0
修改2021-02-20 20:48:24
举报
文章被收录于专栏:DPDK的那些事

前言

DPDK KNI是什么

KNI全称为Kernel NIC Interface,是DPDK框架下实现的DPDK与内核的高性能通信方案。

KNI解决什么问题

主要解决物理网卡被DPDK接管后,仍然需要使用内核协议栈的问题;

此外,相对于TUN/TAP方式,减少一次拷贝,性能更高。

KNI如何使用

  • 加载rte_kni.ko模块
  • 整体初始化:rte_kni_init
  • 创建/释放一个KNI接口:rte_kni_alloc/rte_kni_release
  • 报文收发:rte_kni_rx_burst/rte_kni_tx_burst

几个问题

KNI是DPDK引入的技术,早期实现上为了高性能有不少问题,以下逐个分析(注:部分问题在最新版本中已经解决)

KNI FIFO内存一致性问题

KNI实现中,DPDK程序与内核间,一般都是两个线程在处理,通信方式是FIFO,收发方向都有单独的FIFO;

早期实现仅考虑了strongly-ordered systems,典型的x86,因为未触发乱序问题(buffer与read/write指针的乱序行为)。

后续版本中,ARM环境的引入暴露了此问题,导致mbuf被复用等问题发生。

解决方式是引入合适的memory barrier。

KNI 巨帧包(scattered packets)处理问题

之前提到KNI相对于TUN/TAP方式,减少了一次拷贝。

  • TUN/TAP方式
    • 第一次拷贝:DPDK程序将报文发往内核,此时write系统调用拷贝;
    • 第二次拷贝:内核收到消息后,拷贝到skb中。
  • KNI方式
    • DPDK程序将报文发往内核,通过共享大页内存实现,避免了此次拷贝;然后将报文从大页拷出到skb中。

从上面的对比可以看出,KNI核心是共享大页内存,FIFO传递物理地址,内核收到后转换为内核地址进行处理。

但是在网络中,存在一种mbuf chain情况(典型的,mbuf本身2k,收包9k,会串成5个mbuf构成的chain),在用户态这些mbuf都是通过虚拟地址方式连结,往KNI传递时会遇到地址转换问题。

分两种情况:

  • chain上所有mbuf属于同一块大页内存,此时通过首片的偏移能够推算出后续的偏移;KNI默认采用此方式。
  • chain上的mbuf属于不同大页内存,此时就不能通过首片来计算。KNI内核会得到错误地址,严重时导致crash。 修复方式:提前将chain上mbuf地址转换为物理地址。 https://git.dpdk.org/dpdk/commit/?id=5eb1708ec1db1f2d644f44a42468139df0b0ad6c

KNI释放时mbuf泄露问题

KNI早期实现未考虑KNI释放时,FIFO中mbuf的释放问题,反复创建/释放KNI口的情况下可能会导致mbuf泄露。

修复方式:KNI释放时转换未处理的mbuf

https://git.dpdk.org/dpdk/commit/?id=e77fec694936ce067153c5a6596c6bc818baaa5c

后续发展

evendfd+epoll+workqueue方式处理报文

当前KNI内核部分,是通过启动一个内核线程轮询收包实现,为了避免占用CPU过多,又加入了sleep机制,导致KNI的CPU/时延/吞吐等都不是很理想。更合理的方式是通过eventfd机制,用户态发包后唤醒kernel处理,采用NAPI类似方式,使得CPU/时延/吞吐达到理想状态。

多队列支持

当前KNI不支持多队列,极限性能受限(single线程模式不超过1GBps,mutiple线程模式又占用过多资源)。

在实现eventfd基础上,再实现多队列机制,可以让性能更加,同时在闲时不占用额外资源。

参考连接

https://doc.dpdk.org/guides/prog_guide/kernel_nic_interface.html

http://doc.dpdk.org/api/rte__kni_8h.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • DPDK KNI是什么
      • KNI解决什么问题
        • KNI如何使用
        • 几个问题
          • KNI FIFO内存一致性问题
            • KNI 巨帧包(scattered packets)处理问题
              • KNI释放时mbuf泄露问题
              • 后续发展
                • evendfd+epoll+workqueue方式处理报文
                  • 多队列支持
                  • 参考连接
                  相关产品与服务
                  私有网络
                  私有网络(Virtual Private Cloud,VPC)是基于腾讯云构建的专属云上网络空间,为您在腾讯云上的资源提供网络服务,不同私有网络间完全逻辑隔离。作为您在云上的专属网络空间,您可以通过软件定义网络的方式管理您的私有网络 VPC,实现 IP 地址、子网、路由表、网络 ACL 、流日志等功能的配置管理。私有网络还支持多种方式连接 Internet,如弹性 IP 、NAT 网关等。同时,您也可以通过 VPN 连接或专线接入连通腾讯云与您本地的数据中心,灵活构建混合云。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档