当前位置: 首页 > news >正文

网络编程之XDP、TC和IO_URING以及DPDK

一、网络编程常见的技术

在前面已经分析过了XDP、TC和eBPF。也基本把三者间的关系理清了,但现在又有一个疑惑涌了上来。在前面提到过的IO_URING和DPDK与这些技术有什么关系呢?其实只要认真的看过分析文章可能大家心里都已经基本清楚了。
正如在前面不断提到的,网络编程不是简单的一个部分在努力,它是一个系统工程,从网卡到驱动,从驱动到内核的协议栈再到上层的应用。它是一整套完整的流程,在这个流程上,就如学计算机知识的都明白的木桶原理,只要有一个不够给力,那么其它人的努力可能就大为减弱甚至是失效。
明白了上述的说明,基本也就弄明白了几者之间的关系。

二、技术间的关系

仍然按照传统的用户层、内核和驱动(硬件NIC)三层来说明几者的关系:
1、IO_URING是一个异步编程框架,可以认为是提供给应用层使用的一个网络编程框架,一如开发经常使用epoll,select,poll等。它更多的是向上层提供一套更高效的网络通信接口。
2、DPDK:DPDK属于用户层程序可以直接处理网络数据的一种框架,它可以略过大多数的和内核交互的过程。DPDK的优秀之处已经在应用中体现出来,但是DPDK的不足也同样暴露了出来,
3、XDP、TC(eBPF)则可以认为是与DPDK不同的另外一种方案,DPDK是尽量减少和内核的交互,直接连接用户层和网络数据(驱动或网卡),而XDP等则在仍然与内核保持较强的联系
可以简单理解为,IO_URING是为应用层服务的。后两者是在内核层次上的一次优化。虽然DPDK也实现了用户层的网络数据处理,但从数据处理的方式来看,仍然可以将其划到内核逻辑中去。而XDP等则可以看作内核对DPDK一种快速的应变。
下面是三者的关系图:

在这里插入图片描述

三、应用分析

针对这三类技术,做一下整体的技术应用分析:
1、IO_URING:
做存储起家的异步框架,主要是解决IO与CPU、内存的不匹配出现的。应用在网络编程上,再自然不过。它解决的主要痛点就是在上层应用中支持C100K、C1000K甚至更多。通过对内核的交互大幅减少相关的内存拷贝和通信次数。略过一些不必要的过程,同时对外暴露接口,让用户层感受不到内核的复杂。
目前在Java的Netty 中已经封装了IO_URING的应用,不过据说并没有发挥出其最大效用,有兴趣可以用一下。其它的有名气的应用案例目前还没看到。

2、DPDK
DPDK这个就不用细讲了,在前面已经分析了几十篇,它既可以在上层写传统的SOCKET编程,也可以做为网络监控等的手段。基本上大公司都有基于此框架的应用,开源的更是多,可以去Github上搜索一下就明白了。

3、eBPF(XDP、TC)
XDP之类的应用本身就集成在内核中,再加上eBPF的大力支持,它的应用更多。国内诸如腾讯、阿里等大互联网公司都有相关的应用如蓝鲸;中国移动的磐基,其它开源的也有很多,比如反复提到的Cilium。
不用想,它的应用前景非常被看好,除了各个大公司的支持外,最重要的它是在内核中,免费啊。

在《High-Performance Networking Using eBPF, XDP, and io_uring》,提出了使用IO_URING和XDP以及eBPF一起来实现一个高性能的网络,也就是说,这些技术间其实是互相配合,共同合作为主的。当然,DPDK可能有一点小小小的冲突,这就看大家的实际场景中到底想怎么做了。不过一个普遍比较被大家接受的观点,DPDK还是有一些复杂。

四、总结

学习理论知识十分的枯燥,特别对工作后的人,不论是从记忆力还是注意力,已经从单纯的学习转向了为了生活而打拼。此时对一些理论性的东西往往感到没有什么意义。但还是需要强调的是,计算机技术是一门非常强的理论和实践高度结合的技术学科。理论和实践缺一不可,新技术的突破往往是开发应用瓶颈的突破口,不需要到处再打补丁;同样,丰富的实践场景可以推动技术的完善和创新。
思维不要僵化,要与时俱进。

http://www.lryc.cn/news/380067.html

相关文章:

  • 晶谷高温烧结导电浆料用低熔点玻璃粉 晶谷耐高温导电漆导电油墨高温玻璃粉
  • 【Mysql】DQL操作单表、创建数据库、排序、聚合函数、分组、limit关键字
  • Excel 常用技巧(四)
  • 【Linux 基础】文件与目录管理
  • C++系列-String(一)
  • 服务器硬件的基础知识
  • java基于ssm+jsp 汽车在线销售系统
  • 【干货】Android中高级开发进阶必备资料(附:PDF+视频+源码笔记)
  • AI通用写作模版,可以在此基础上进行修改
  • openEuler2203SP3自定义ios
  • 一年又一年志愿
  • NL2SQL进阶系列(1):DB-GPT-Hub、SQLcoder、Text2SQL开源应用实践详解
  • OpenGL3.3_C++_Windows(15)
  • 出海计划 | 赴马来西亚开展水环境项目考察暨2024中马水务合作论坛
  • NeRF从入门到放弃5: Neurad代码实现细节
  • 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【11】ElasticSearch
  • Pip换源详解
  • 【Docker】——安装镜像和创建容器,详解镜像和Dockerfile
  • 利用LinkedHashMap实现一个LRU缓存
  • git-pull详解
  • 【SQL】count(1)、count(*) 与 count(列名) 的区别
  • 03-ES6新语法
  • Linux中的文本编辑器vi与vim
  • MATLAB基础应用精讲-【数模应用】三因素方差(附R语言、MATLAB和python代码实现)
  • Linux ubuntu安装pl2303USB转串口驱动
  • 关于使用命令行打开wps word文件
  • 将Vite添加到您现有的Web应用程序
  • Apache Kafka与Spring整合应用详解
  • SpringBoot配置第三方专业缓存技术Redis
  • javascript的toFixed()以及使用