20个基于DPDL开源项目,带你冲破内核瓶颈(下)

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
性能测试 PTS,5000VUM额度
云防火墙,500元 1000GB
简介: 20个基于DPDL开源项目,带你冲破内核瓶颈(下)

十、MTCP

MTCP(Many-to-Many TCP)是一种基于用户态的高性能TCP/IP协议栈,主要用于数据中心、云计算等高吞吐量和低延迟的网络应用。相比于传统内核态协议栈,MTCP具有更低的上下文切换开销、更少的锁竞争以及更好的可扩展性和灵活性。MTCP支持多线程套接字API,并提供了类似POSIX socket API的接口,可以很方便地替换标准socket API使用。此外,MTCP还提供了丰富的工具来帮助用户进行网络应用程序开发和调试,如Packet Generator、Flow Monitor等等。

所以说在mTCP的源码文件中是直接附带了一个DPDK的。总的说来,官方的安装步骤大致分成三部分:

  1. 检查安装该有的库
  2. 安装dpdk环境
  3. 安装mTCP环境

接下来详细叙述安装步骤

相关库的安装以及检查,linux头文件的检查:

- libdpdk (Intel's DPDK package*)
- libnuma
- libpthread
- librt
- libgmp (for DPDK/ONVM driver)
- For Debian/Ubuntu, try apt-get install linux-headers-$(uname -r)$

注意,这些库的名字可能在不同的系统上略有不同,可能是"-dev","-devel"形式的。另外千万注意检查是否存在运行内核版本一致的linux头文件。

DPDK安装与设置,这儿有个坑。mtcp自带的用于安装dpdk的脚本,相关命令都是sudo开头的,你的系统上可能没有安装sudo这个命令的,另外如果你是在root权限下的话,可能由于sudoers文件的配置原因,也是无法使用这个命令的。在执行脚本之前,确保能够顺利执行sudo命令。另外需要注意的是,在这儿直接使用mtcp自带的dpdk,可以进入mtcp/dpdk的文件夹,在里面直接使用dpdk的脚本来安装环境,具体过程可以参考dpdk官方文档。

Download dpdk submodule
git submodule init
git submodule update

进入dpdk文件夹,安装dpdk,推荐参考dpdk官方文档。主要参考其中的第3部分与第5部分。

创建一个单独的build文件夹,在dpdk目录下执行 meson 。

cd build
ninja
ninja install
ldconfig

注意最后两条命令需要root身份执行。至此dpdk安装完毕,可以去检查一下是否存在一个 kmod目录。

接下来安装相关的驱动,因为dpdk会接管网卡,使用自己的驱动的。此处可以有两个选择uio_pci_generic以及igb_uio.ko。我们选择后者,因为是mTCP中要求的。

sudo modprobe uio
sudo insmod kmod/igb_uio.ko

至此dpdk部分已经安装完毕。可以使用ifconfig命令观察一下网卡情况,记一下那张以太网的网卡名称,可能是eth0,也可能是eno1类似的名字。

最后设置DPDK的环境,可以使用dpdk里面附带的脚本来操作,mtcp/dpdk/usertools/dpdk-devbind.sh用于网卡的绑定,先使用命令/dpdk-devbind.sh --status 查看当前的网卡状态,应该会得到类似如下的信息:

其中需要注意的就是Network devices using kernel driver一栏,我们需要将相关的网卡驱动卸载掉,换成dpdk的驱动,让dpdk来接管网卡。可以看到下面有一些重要信息,其中00:1f.6是网卡的PCI总线地址,eno1是其名,e1000e是其正在使用的驱动,igb_uio是dpdk的驱动,我们等下就是要将这个驱动装上去的。特别注意的是后面还有一个Active,这说明当前机器正在使用这个网卡,如果想要换驱动的话,需要先将这个网卡卸下来。如果你是使用的ssh远程登陆的话,而且你的机器只有这一张网卡的话,那么卸载网卡后你就没有办法登陆机器了,所以卸载之前慎重。

  • 1. ifconfig eno1 down 网卡卸载了
  • 2. ./dpdk-devbind.sh --bind=igb_uio 00:1f.6 绑了新驱动了

1. 最后我们使用mtcp自带的工具来注册以太网端口

./setup_mtcp_dpdk_env.sh

注意选择register the Ethernet ports项,我的版本上是24,你的版本可能不同的。然后选择选项退出这个脚本,我的版本是35选项,你的可能不同。

mTCP环境安装,主要参考官方文档:

sudo ifconfig dpdk0 x.x.x.x netmask 255.255.255.0 up
export RTE_SDK=
export RTE_TARGET=x86_64-native-linuxapp-gcc
./configure --with-dpdk-lib= R T E S D K / RTE_SDK/RTE 
S
 DK/RTE_TARGET
make
  • 至此安装完毕,可以最后做一些检查工作。
  • autoreconf -ivf ,观察输出是否有error
  • ifconfig 检查是否有dpdk0这张网卡
  • 检查mtcp/lib目录下的libmtcp.a文件
  • 检查mtcp/include下是否有头文件
  • 检查apps/example下是否有二进制文件

十一、Butterfly – 连接虚拟机

Butterfly 连接虚拟机 (VM) 并控制其流量。

每个 VM 流量都包含在特定的VXLAN 网络中,并且流量由(EC2/Openstack-like)安全组过滤。

安全组可以应用于任何 VM 接口,并包含一个简单的网络规则列表(默认丢弃流量)。

虚拟网卡

在 Butterfly 中,虚拟 NIC(或 vnic)使您能够通过 vhost-user 向 Qemu VM 添加虚拟网络接口。每个 vnic 都有一个 24 位的网络 ID,称为 VNI。如果两个具有相同 VNI 的 vnic 位于不同的物理主机上,Butterfly 会通过 VXLAN 封装 VM 数据包,并将它们发送到相应的物理主机。一旦收到,数据包将被解封装并路由到它们的最终目的地。使用相同 VNI 创建的所有 vnic 都位于同一网络上。如果具有相同 VNI 的两个 vnic 位于同一物理主机上,则数据包不会退出到物理网络。

Butterfly 旨在使用专用DPDK端口连接到物理网络 。它允许 Butterfly 在使用物理 NIC 卸载功能时在 VM 之间具有非常低的延迟。

对于 VM 到 VM 通信,不会发生校验和和分段,因为数据包不会在物理网络上传输。这使 Butterfly 能够在 VM 之间进行高速和低延迟的通信。

示例:在 vni "1337" 上创建新的 vnic "vnic_1":

butterfly nic add --ip 42.0.0.1 --mac 52:54:00:12:34:01 --vni 1337 --id vnic_1

数据筛选

使用 Butterfly 中的集成防火墙(NetBSD 的 NPF)为每个 vnic过滤 VM 流量。过滤规则根据其安全组中包含的规则应用于每个 VM 。一个 vnic 可以使用多个安全组,一个安全组可以由多个 vnic 使用。当一个 vnic 使用多个安全组时,规则会累积。安全组包含要允许的规则列表(默认策略是阻止)和成员列表(IP 地址)。

Butterfly 规则主要由协议/端口和允许的源描述。此源可以是 CIDR 块安全组的成员。

示例:在“mysg”安全组中添加一条规则,允许 22 端口上的 TCP 协议中的 42.0.3.1:

butterfly sg rule add mysg --ip-proto tcp --port 22 --cidr 42.0.3.1/32

示例:在“mysg”安全组中添加一条规则,允许“users”安全组成员在80端口使用TCP协议:

butterfly sg rule add mysg --ip-proto tcp --port 80 --sg-members users

注意:当一个或多个 vnic 使用的安全组被修改时,附加到每个受影响的 VM 的防火墙规则会重新加载。

使用

Butterfly 是一个可以通过网络 API 控制的守护进程。

它与客户端打包在一起,主要允许您添加/删除/列出 vnic 和安全组。

您当然可以直接编写对 Butterfly API 的调用。API 消息传输基于ZeroMQ,消息以Protobuf 格式编码。查看协议 以获取更多详细信息。

下面是一个 Butterfly 示例,其中 6 个 VM 隔离在三个网络(VNI 42、51 和 1337)中。

Butterfly 绑定一个专用网卡来发送/接收 VXLAN 数据包,并绑定一个套接字(默认:tcp)来监听对其 API 的查询。如果您使用 DPDK 兼容卡,您将无法通过它访问 API。

您可以使用几行客户端调用来构建此配置:

butterfly nic add --ip 42.0.0.1 --mac 52:54:00:12:34:01 --vni 42 --id vnic_1
butterfly nic add --ip 42.0.0.1 --mac 52:54:00:12:34:01 --vni 51 --id vnic_2
butterfly nic add --ip 42.0.0.2 --mac 52:54:00:12:34:02 --vni 51 --id vnic_3
butterfly nic add --ip 42.0.0.3 --mac 52:54:00:12:34:03 --vni 51 --id vnic_4
butterfly nic add --ip 42.0.0.1 --mac 52:54:00:12:34:01 --vni 1337 --id vnic_5
butterfly nic add --ip 42.0.0.2 --mac 52:54:00:12:34:02 --vni 1337 --id vnic_6

提示:如果您想查看图形的外观:运行butterfly status并复制webgraphviz.com 中的点图

您可以随时编辑安全组,这会自动更新 vnics 过滤。在下面的示例中,我们创建了一个新规则,以允许 http 协议中的所有人,并要求一些 vnic 使用此安全组。

butterfly sg add sg-web
butterfly sg rule add sg-web --ip-proto tcp --port 80 --cidr 0.0.0.0/0
butterfly nic sg add vnic_1 sg-web
butterfly nic sg add vnic_2 sg-web

注意:Butterfly API 使用幂等性,这意味着两次调用应该产生相同的结果。

十二、OpenNet开源网络库

OpenNet是一个高性能的开源网络库,由中国电信研究院开发。它提供了一组可扩展、可重用和易于使用的网络编程接口,支持TCP、UDP、HTTP等协议。OpenNet采用事件驱动模型,基于epoll或kqueue实现高并发网络通信,在处理海量并发连接时表现出色,被广泛应用于互联网服务端开发领域。

十三、NetBricks

NetBricks是一个高性能的网络函数框架,由斯坦福大学研究团队开发。它提供了一组可扩展、可重用和易于使用的网络编程接口,支持TCP、UDP等协议。NetBricks采用数据包处理管线(packet processing pipeline)模型,基于DPDK实现高速数据包处理,在网络功能虚拟化(Network Function Virtualization, NFV)、边缘计算(Edge Computing)等领域有广泛应用。

十四、F-Stack

F-Stack是一个基于DPDK(Data Plane Development Kit)的高性能网络框架,由中国国内开发团队研发。它提供了一组可扩展、高效和易用的网络编程接口,支持TCP/IP协议栈和UDP等协议,具有零拷贝(zero copy)、多核并行处理、CPU亲和性等特性。F-Stack被广泛应用于虚拟化环境、大规模互联网服务器集群等场景中。

F-Stack的主要特点包括:

  1. 支持DPDK:利用DPDK提供的零拷贝技术来避免数据复制带来的性能损失;
  2. 多核并行处理:通过利用多核心CPU实现同时处理多个连接以及发送/接收数据;
  3. 高效:使用预分配内存池技术来减少动态内存分配操作以及减轻垃圾回收压力;
  4. 简单易用:提供了面向事件驱动编程模型,简化了网络编程流程;
  5. 兼容POSIX标准:可以直接使用POSIX标准函数进行开发。

十五、ThunderX NFV

hunderX NFV是卡普林公司(Cavium)推出的一款面向网络功能虚拟化(NFV)场景的处理器,基于ARMv8架构。它具有高性能、低功耗和可扩展性等优势,适合用于构建大规模的虚拟化网络环境。

ThunderX NFV采用了多核心设计,每个核心都可以支持多线程,最多可以实现96个物理核心和192个虚拟核心。此外,它还集成了丰富的硬件加速引擎,例如加密/解密、压缩/解压、流量管理等,并且支持RDMA和SR-IOV等新型技术。

除了硬件方面的优势外,ThunderX NFV还提供了全套的软件生态系统。它可以兼容Linux操作系统,并且支持OpenStack、DPDK和OPNFV等开源平台。此外,卡普林公司还提供了完整的SDK和工具链,使得用户可以轻松地进行应用开发和调试。

十六、DPVS

DPVS(Direct Project Virtual Server)是一个高性能、轻量级的四层负载均衡软件,由中国电信开发。它基于Linux内核实现,可以在多个服务器之间分配并平衡网络流量,以提高应用的可靠性和可扩展性。

DPVS支持多种负载均衡算法,例如轮询、最小连接数和源地址哈希等。它还支持会话保持和健康检查等功能,可以确保请求被正确地路由到目标服务器,并避免单个服务器出现过载情况。此外,DPVS还可以与其他网络设备集成使用,例如防火墙和VPN等。

DPVS采用了用户态数据包处理技术,在数据包转发时无需进入内核空间进行处理。这种设计使得DPVS具有卓越的性能和吞吐量,并且能够快速响应高峰期的流量负载。同时,DPVS还支持CPU亲和性调度、NUMA感知和动态配置等特性,以优化系统资源利用率。

编译安装

虽然github官方上说明不再支持dpdk-stable-20.11.1之前的版本了,但是目前新分支还出与开发阶段,我没有编译通过。所以我用的版本还是dpdk18.11.2 + dpvs1.8. 首先安装dpvs1.8版本在github上的官方介绍一样下载1.8版本的dpvs源代码。

$ git clone https://github.com/iqiyi/dpvs.git
$ cd dpvs

下不来的话可以直接去码云网站https://gitee.com 下载release包。然后进到dpvs目录,再下载dpdk源码:

$ wget https://fast.dpdk.org/rel/dpdk-20.11.1.tar.xz   # download from dpdk.org if link failed.
$ tar xf dpdk-20.11.1.tar.xz

接下来打补丁,在打补丁之前我们先来安装一些工具包防止在后面的编译过程中报错,有的话可以跳过:

yum install  python3 (Python 3.5 or later.) 
pip3 install meson ninja //Meson (version 0.49.2+) and ninja
pip3 install pyelftools 或者yum install pyelftools
yum install -y popt-devel automake libnl3 libnl3-devel openssl openssl-devel numactl kernel-devel libpcap-devel unzip patch numactl-devel

另外,注意安装gcc前要安装和内核版本匹配的kernel-devel, 查看 ls /usr/src/kernels/, 并且 ldd --version 查看glibc版本要求 glibc >= 2.7(拜托2.17 大于 2.7)

编译dpdk

在编译dpvs之前要先编译DPDK:

cd dpvs-1.8/
cp patch/dpdk-stable-18.11.2/*.patch dpdk-stable-18.11.2/
cd dpdk-stable-18.11.2/
patch -p1 < 000
...
make config T=x86_64-native-linuxapp-gcc
make
export RTE_SDK=$PWD
export RTE_TARGET=build
echo 8192 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 8192 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
// 如果很多个numa节点,可以用如下命令:
for i in {0..7};do echo 8192 > /sys/devices/system/node/node$i/hugepages/hugepages-2048kB/nr_hugepages;done
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
grep Huge /proc/meminfo
 # 需要开机自动挂载的话可以在
 $ echo "nodev /mnt/huge hugetlbfs defaults 0 0" >> /etc/fstab
modprobe uio
cd dpdk-stable-18.11.2
insmod build/kmod/igb_uio.ko
insmod build/kmod/rte_kni.ko carrier=on
./usertools/dpdk-devbind.py --status
// 172.18.8.129: eno4 100.200.0.129  30:fd:65:32:e8:c3  0000:1a:00.3
// 172.18.8.129: eno1                30:fd:65:32:e8:c0  0000:1a:00.0
ifconfig eno4 down
./usertools/dpdk-devbind.py -b igb_uio 0000:1a:00.3
./usertools/dpdk-devbind.py --status
./usertools/dpdk-devbind.py -u 0000:1a:00.0
./usertools/dpdk-devbind.py -b i40e 0000:1a:00.0

编译dpvs

编译dpvs比较简单,只需要配置export PKG_CONFIG_PATH=/opt/sj/dpvs-1.8/dpdk-stable-18.11.2/dpdklib/lib64/pkgconfig/libdpdk.pc 然后到dpvs目录下编译即可

cd ..
make // 报 inline 函数未定义的错误,需要在 src/Makefile CFLAGS 参数最后-mcmodel=medium之前加上 -fgnu89-inline
make install

运行DPVS

拷贝./conf/下合适的配置文件到 /etc/dpvs.conf

总结一下,我遇到过的问题:

  1. 运行./bin/dpvs 如果报段错误退出则需要调整配置文件中的pktpool_size,我猜测是因为这个值太大了导致内存不足。可以把这个值改小一些,并且屏蔽一些cpu,减少消耗。我这样操作之后能跑起来了。
  2. 我遇到另外一个coredump退出的情况,使用1中的方法不生效。于是我打开src/Makefile中的DEBUG开关,用gdb跑dpvs,因为不知道断点在哪里只能run,得到的信息如下,基本没用
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff440d700 (LWP 47658)]
0x00000000006162f9 in conn_term_lcore ()
Missing separate debuginfos, use: debuginfo-install glibc-2.17-196.el7.x86_64 libgcc-4.8.5-16.el7.x86_64 li.0.2k-24.el7_9.x86_64 zlib-1.2.7-19.el7_9.x86_64

于是,我又打开了/etc/dpvs.conf中的log_level为DEBUG,再次启动程序得到有效信息如下所示:

EAL: rte_mem_virt2phy(): cannot open /proc/self/pagemap: Too many open files

应该是系统允许最大打开文件数太小所致,用ulimit -a查看果然只有1024,用ulimit -n 1048576改成较大的数量,再次启动DPVS进程这次可以了。

3. 报错“DPVS_MAX_SOCKET is smaller than system numa nodes!”,查看源码发现是numa节点数小于系统常量DPVS_MAX_SOCKET,再次查找这个DPVS_MAX_SOCKET,发现它是在src/config.mk文件中定义并被编译到源码里,因此需要修改成numa节点数(numactl --hardware查看numa节点数)并再次编译。

十七、Vhost-user-net

Vhost-user-net是一种虚拟化网络设备技术,它通过将网络设备抽象为一个用户态程序来实现高性能和灵活性。具体来说,它使用了vhost-user协议来进行数据交换,从而避免了内核空间与用户空间之间的上下文切换和数据复制等开销。

在Vhost-user-net中,vhost-user程序扮演着两个角色:vhost-user客户端和vhost-user服务器。其中,vhost-user客户端运行在虚拟机中,负责接收和发送网络数据包。而vhost-user服务器则运行在主机上,负责处理网络数据包并将其转发到物理网卡或其他虚拟机中。

Vhost-user-net可以与多种虚拟化管理器和操作系统集成使用,例如QEMU、KVM、Xen等。通过这些软件的支持,Vhost-user-net可以实现多租户隔离、动态配置、快速迁移等特性,并且支持多种协议(如TCP/IP、UDP/IP、VLAN等)和各种网络功能(如防火墙、NAT、负载均衡等)的部署。

十八、OpenNFP

OpenNFP(Open Network Function Pipeline)是一种基于FPGA实现的高性能网络功能虚拟化(NFV)框架。它提供了一个可编程的数据平面,并且允许将各种网络功能模块组合在一起,以构建自定义的网络应用程序。

OpenNFP具有以下几个特点:

  1. 基于硬件:使用FPGA实现高速数据包处理和转发,可以实现比传统软件路由器更高的性能和吞吐量。
  2. 可编程:OpenNFP提供了一个可编程的数据平面,可以通过修改硬件逻辑来支持不同类型的协议、报文格式和网络功能。
  3. 模块化:OpenNFP支持将多个网络功能模块组合在一起,形成一个完整的网络应用程序。这些模块可以独立开发、测试和部署,从而提高了开发效率和灵活性。
  4. 开放源代码:OpenNFP是一个开源项目,任何人都可以获取源代码并进行修改、定制或扩展。

十九、VCL

VCL (Virtual Computing Lab) 是一种基于云计算技术的虚拟化实验平台,用于支持远程教育和在线实验。它允许用户通过网络连接到云端的虚拟机上,进行各种软件开发、测试和实验等操作。

VCL 的主要特点如下:

  1. 高度灵活:VCL 支持多种操作系统和软件环境的虚拟化,并提供了多种配置选项和管理工具,可以满足不同用户需求的定制化要求。
  2. 易于使用:VCL 提供了简单易用的 Web 界面,用户可以通过几个简单步骤就能创建自己的虚拟机环境,并轻松地进行远程访问。
  3. 安全性高:VCL 采用严格的身份认证和授权机制,确保只有合法用户才能访问虚拟机资源;同时还提供了安全审计和监控功能,及时检测并防范任何潜在威胁。
  4. 成本低廉:由于 VCL 是基于云计算技术构建的,在硬件设备、网络带宽等方面都具有较高的资源利用效率,从而降低了成本。

二十、libmoon

ibmoon是一个基于DPDK和LuaJIT的高性能网络应用框架,主要用于开发高速数据包处理、网络测试和流量生成工具。

Libmoon的主要特点如下:

  1. 基于DPDK:Libmoon使用DPDK提供的高性能数据包I/O功能,支持多个物理或虚拟网卡,并可通过CPU亲和性和NUMA优化等手段进一步提升性能。
  2. 基于LuaJIT:Libmoon使用LuaJIT作为脚本引擎,使得用户可以通过简单易用的Lua语言编写复杂的网络应用程序,从而大大降低了开发难度。
  3. 高效灵活:Libmoon采用事件驱动模型,具有高效、灵活、可扩展等特点。它可以实现自定义协议解析、数据包过滤、路由选择、负载均衡等功能,并支持多种流量生成模式。
  4. 易于部署:Libmoon提供了方便易用的部署工具,并与Docker等容器技术兼容。用户只需在任意硬件平台上安装DPDK和LuaJIT即可运行。

目前Libmoon已被广泛应用于各种网络应用场景,如大规模分布式系统测试、DDoS攻击仿真、智能路由器设计等。它为用户提供了高度灵活、易于使用和高性能的网络应用开发框架,是一种非常有价值的技术。

二十一、DPDK项目实战

那什么样的程序员适合学习dpdk技术?

对于dpdk来说,它更看重计算机原理和底层技术,和业务上的关联不大,适合:

  1. 计算机相关专业,对底层技术原理感兴趣的应届生;
  2. 对网络原理、dpdk、高性能网络开发的在职工程师;
  3. 工作中从事dpdk/vpp/ovs等开发的工程师;
  4. 有良好的计算机原理和底层技术基础,想往互联网行业发展的桌面开发,c++开发工程师等等。

这里给大家推荐零声教育全网独家的【dpdk-网络协议栈-vpp-OVS-DDos-虚拟化技术课程体系,通过32个项目案例,2W+行手写代码,全面解析4个dpdk技术方向:

21.1DPDK网络专栏

(1)dpdk基础知识

  • 1.多队列网卡,vmxnet/e1000
  • 2.igb_ uio与vfio模块
  • 3.kni模块
  • 4.hugepage的理解
  • 5.零拷贝
  • 6.dpdk与netmap区别
  • 7.dpdk的工作环境

(2)网络协议栈

  • 1.dpdk-arp
  • 2.netsh静态arp表设置
  • 3.dpdk-icmp
  • 4.udp协议格式分析
  • 5.udp协议sendto, recvfrom实现
  • 6.dpdk-ip
  • 7.dpdk-tcp
  • 8.tcp协议栈bind,listen, accept实现
  • 9.tcp协议栈recv, send, close的实现
  • 10.tcp三次握手实现
  • 11.tcp四次挥手实现
  • 12.tcp acknum与seqnum的确认机制实现
  • 13.tcp的并发连接设计
  • 14.epoll并发的实现
  • 15.tcp协议栈与epoll之间的回调实现

(3)dpdk组件项目

  • 1.dpdk-ac
  • 2.dpdk-kni
  • 3./dev/ kni的原理分析
  • 4.kni_ dev的流程
  • 5.kni的t缓冲区,rx缓冲区
  • 6.kni的用户空间与内核空间映射
  • 7.mbuf如何转化为kernel的sk_ buff
  • 8.dpdk- timer
  • 9.bpftrace的使用
  • 10.dpdk- bpf源码流程

(4)dpdk经典项目

  • 1.dpdk- dns
  • 2.dpdk- gateway
  • 3.dpdk-ddos熵计算源码
  • 4.ddos attach检测精确度调试
  • 5.ddos attach测试T具hping3
  • 6.布谷鸟hash原理与使用

21.2储存技术专栏

(1)高效磁盘io读写spdk(C)

  • 1.存储框架spdk,为技术栈打开扇存储的大门
  • 2.spdk运行环境与vhost
  • 3.NVMe与PCl的关系
  • 4.手把手实现spdk_ server
  • 5.nvme与pcie以及手写nvme读写操作
  • 6.bdev与blob之间的关系
  • 7.实现blob异步读写
  • 8.blobstore的读写操作实现与rpc的关系
  • 9.fio性能测试性能对比libaio,io_ uring,psync
  • 10.fio plugin工作流程
  • 11.fio plugin开发

(2)spdk文件系统的实现

  • 1.文件系统功能拆解
  • 2.spdk_ env_ init与spdk_ app init的差别
  • 3.spdk_ _thread_ poll实现rpc回调
  • 4.fs_ operations结构体定义
  • 5.file_ operations结构体定义
  • 6.dir_ operations结构体定义
  • 7.syscall的hook实现
  • http://8.io内存管理
  • 9.基数树对文件系统内存管理
  • 10.spdk_ blob的open,read,write,close
  • 11.测试用例与调试入口函数

(3)spdk kv存储的实现

  • 1.KV存储拆解Set, Get, Mod, Del
  • 2.app/.a库/so库对于kv存储的选择
  • 3.bdev与blob对于kv存储的选择
  • 4.kv service启动blob资源操作
  • 5.kv service关闭blob资源回收
  • 6.kv service接口set,get,modify,delete
  • 7.kv遍历与查找实现
  • 8.page存储chunk的管理
  • 9.pagechunk的get与put
  • 10.page单查找与多页查找
  • 11.btree, artree, hashmap,radixtree, rbtree之间的选择
  • 12.slab的实现
  • 13.slab分配slot与释放slot
  • 14.为kv加上conf文件
  • 15.测试用例与性能测试

21.3安全与网关开发专栏

(1)可扩展的矢量数据包处理框架vpp(c/c++)

  • 1.vpp命令详解
  • 2.mac/ip转发plugin
  • 3.load_ balance plugin
  • 4.flowtable plugin
  • 5.vpp源码之间的差异
  • 6.多网卡数据接收与转发
  • 7.解决plugin编译加载
  • 8.vpp启动load so的流程
  • 9.vpp的结构体vlib_ _main实现分析
  • 10.vpp的结构体vnet_ main
  • 11.vector的操作实现
  • 12.vpp vcl库与LD_ PRELOAD实现分析
  • 13.vcl原理讲解
  • 14.vcl tcpserver实现原理
  • 15.vcl tcpclient实现原理
  • 16.vcl与iperf3的客户端与服务器
  • 17.vcl与nginx的wrk性能测试
  • 18.vcl与haproxy的性能测试
  • 19.vpp 1801版本与vpp 2206版本
  • 20.vpp httpserver的实现源码
  • 21.vpp plugin quic源码分析
  • 22.vpp plugin hs_ app的源码
  • 23.vpp plugin rdma的实现分析
  • 24.vpp plugin loadbalance
  • 25.vpp plugin nat的源码分析
  • 26.vpp host-stack tcp协议实现
  • 27.vpp plugin的测试用例实现

(2)golang的网络开发框架nff-go(golang)

  • 1.nff-go实现的技术原理
  • 2.nff-go/low.h实现分析
  • 3.nff- go数据接收的实现
  • 4.nff-go数据发送的实现
  • 5.ipsec协议解析与strongswan的ipsec
  • 6.nff go的缺陷与不足

21.4虚拟化与云原生专栏

(1)DPDK的虚拟交换机框架OvS

  • 1.ovs编译安装,ovs核心组件内容
  • 2.ovs-vswitchd的工作原理
  • 3.ovs-vswitchd与dpdk的关系
  • 4.ovs-vsctl的网桥,网口操作
  • 5.qemu-system-x86_ 64构建多子网
  • 6.ovs与qemu数据流分发
  • 7.ovs搭建docker跨主机通信
  • 8.ovsdb server与ovsdb协议
  • 9.json-rpc为控制面提供开发
  • 10.ovs-tcpdump/ovs-l3ping
  • 11.OvS 4种数据路径
  • 12.VXL AN数据协议
  • 13.ovs流量统计

(2)高性能4层负载均衡器DPVS

  • 1.dpvs的技术组件与功能边界
  • 2.lvs+keepalived配置高可用server
  • 3.dpvs与|lvs+ keepalived的关系
  • 4.dpvs.conf的配置文件
  • 5.dpvs的FNat/NAT/SNAT模式
  • 6.dpvs的DR模式
  • 7.dpvs的tun模式
  • 8.通过quagga配置ospf
  • 9.dpvs的tc流控操作与源码实现
  • 10.dpvs代码架构分析
  • 11.dpvs测试用例ipset, tc,mempool

21.5测试工具专栏

(1)perf3

  • 1.vpp vcl的perf3接口hook
  • 2.perf3测网络带宽
  • 3.tcp吞吐量测试
  • 4.udp丢包与延迟测试
  • 5.json测试结果输出

(2)TRex

  • 1.TRex的运行原理
  • 2.TRex与dpdk
  • 3.构建TRex测试系统
  • 4.t-rex -64- debug gdb调试
  • 5.bg-sim- 64模拟单元测试
  • 6.YAML文件编写
  • 7.流编排与自动化框架
  • 8.报文变量设置

(3)dpdk-pktgen

  • 1.pktgen命令讲解
  • 2.default.cfg配置文件分析
  • 3.120M bits/s的转发速率

(4)fio

  • 1.ioengine的实现
  • 2.ioengine_ ops的分析
  • 3.iodepth的分析
  • 4.spdk_ nvme的fio分析
  • 5.spdk_ bdev的fio分析
  • 6.spdk_ blob的ioengine实现
  • 7.psync,io_ uring, libaio性能对比

21.6性能测试专栏

(1)性能指标

  • 1.吞吐量bps
  • 2.拆链/建链pps
  • 3.并发
  • 4.最大时延
  • 5.最小时延
  • 6.平均时延
  • 7.负载
  • 8.包速fps
  • 9.丢包率

(2)测试方法

  • 1.测试用例
  • 2.vpp sandbox
  • 3.perf3灌包
  • 4.rfc2544

还不熟悉的朋友,这里可以先领取一份dpdk新手学习资料包(入坑不亏):

想系统学习,也可以扫码备注咨询,领取粉丝专属福利优惠券。

学习后可从事开发岗位:

  1. 高级网络开发工程师
  2. DPDK开发工程师
  3. 云产品研发工程师
  4. 云基础开发工程师
  5. 高性能优化工程师
  6. SDN开发工程师
  7. NFV开发工程师

写在最后:

Dpdk作为目前在互联网越来越流行的底层技术,受到越来越多的优秀互联网公司的欢迎与使用。但对于不少程序员来说可能只是见过或是听过,并没有深入的学习和使用。

相关文章
|
JavaScript API 虚拟化
20个基于DPDL开源项目,带你冲破内核瓶颈(上)
20个基于DPDL开源项目,带你冲破内核瓶颈
|
3月前
|
算法 调度 UED
揭秘操作系统背后的暗战:进程调度与优先级反转的惊心动魄!
【8月更文挑战第21天】操作系统核心管理计算机资源,进程调度为其关键功能,决定CPU使用权,影响系统性能与用户体验。优先级反转是多任务环境下常见挑战:高优先级进程因等待低优先级进程占用的资源而被阻塞,导致系统效率下降。通过优先级继承或提升机制可解决此问题,确保系统资源高效利用与响应时间优化。
41 1
|
3月前
|
存储 人工智能 算法
操作系统的演化之路:从单一任务到多任务处理
【8月更文挑战第12天】 在计算机科学的历史长河中,操作系统作为硬件与软件之间的桥梁,其发展经历了由简单到复杂、由单一到多元的转变。本文旨在探究操作系统如何实现从执行单个任务到同时管理多个任务的飞跃,并分析这一变革对现代计算技术的影响。通过回顾操作系统的关键发展阶段,我们将理解多任务处理机制的起源和优化过程,以及它如何塑造了今天的数字世界。
|
2月前
|
机器学习/深度学习 算法 物联网
探究操作系统的心脏:调度算法的演变与优化
本文旨在深入探讨操作系统中核心组件——调度算法的发展脉络与优化策略。通过分析从单任务到多任务、实时系统的演进过程,揭示调度算法如何作为系统性能瓶颈的解决关键,以及在云计算和物联网新兴领域中的应用前景。不同于传统摘要,本文将注重于概念阐释与实例分析相结合,为读者提供直观且全面的理解视角。
|
2月前
|
存储 安全 算法
探索操作系统的心脏:内核架构与机制的深度剖析
本文旨在深入探讨操作系统的核心——内核,揭示其架构设计与运行机制的内在奥秘。通过对进程管理、内存管理、文件系统、设备控制及网络通信等关键组件的细致分析,展现内核如何高效协调计算机硬件与软件资源,确保系统稳定运行与性能优化。文章融合技术深度与通俗易懂的表述方式,旨在为读者构建一幅清晰、立体的内核运作全景图。
69 0
|
3月前
|
机器学习/深度学习 人工智能 自动驾驶
操作系统的演化之路:从单任务到多任务处理
【8月更文挑战第16天】 本文将探索操作系统(OS)的演进历程,聚焦于它们如何从处理单一任务的简单系统,发展成为能够同时处理多个任务的复杂系统。我们将分析这一转变背后的技术驱动因素,以及它对用户体验和系统性能的影响。文章还将探讨现代操作系统在面对日益增长的计算需求时所面临的挑战,以及未来的发展方向。
|
5月前
|
机器学习/深度学习 边缘计算 资源调度
下一代操作系统:从单任务到多任务处理的演变
本文探讨了操作系统从单任务处理演变到支持多任务处理的发展历程,分析了关键技术突破和未来趋势。
71 5
|
6月前
|
缓存 算法 Java
Linux内核新特性年终大盘点-安卓杀后台现象减少的背后功臣MGLRU算法简介
MGLRU是一种新型内存管理算法,它的出现是为了弥补传统LRU(Least Recently Used)和LFU(Least Frequently Used)算法在缓存替换选择上的不足,LRU和LFU的共同缺点就是在做内存页面替换时,只考虑内存页面在最近一段时间内被访问的次数和最后一次的访问时间,但是一个页面的最近访问次数少或者最近一次的访问时间较早,可能仅仅是因为这个内存页面新近才被创建,属于刚刚完成初始化的年代代页面,它的频繁访问往往会出现在初始化之后的一段时间里,那么这时候就把这种年轻代的页面迁移出去
|
6月前
|
缓存 算法 调度
探索现代操作系统之芯:内核性能优化的艺术
【5月更文挑战第29天】 在本文中,我们将深入探讨操作系统中最关键的组成部分——内核,以及如何通过各种技术手段提升其性能。与传统的摘要不同,我们不会概述文章的每个部分,而是直接点出核心内容:操作系统内核的性能优化是一个复杂而精细的过程,它涉及到算法改进、内存管理、并发控制等多个方面。本文的目的是为读者提供一个关于现代操作系统内核性能优化的全面视角,并讨论实现这些优化所采取的策略和技术。
|
缓存 网络协议 Linux
20个基于DPDL开源项目,带你冲破内核瓶颈(中)
20个基于DPDL开源项目,带你冲破内核瓶颈(中)