DPDK基本概念-程序员宅基地

技术标签: DPDK  c语言  

1. DPDK简介

随着云计算产业的异军突起,网络技术的不断创新,越来越多的网络设备基础架构逐步向基于通用处理器平台的架构方向融合,从传统的物理网络到虚拟网络,从扁平化的网络结构到基于 SDN(Software Defined Netrork)分层的网络结构,无不体现出这种创新与融合。
这在使得网络变得更加可控制和成本更低的同时,也能够支持大规模用户或应用程序的性能需求,以及海量数据的处理。究其原因,其实是高性能网络编程技术随着网络架构的演进不断突破的一种必然结果。
DPDK(Data Plane Development Kit)是Intel提供的数据平面开发工具集,为IA(Intel Architecture)处理器架构下用户空间高效的数据包处理提供库函数和驱动的支持,它不同于Linux系统以通用性设计为目的,而是专注于网络应用中数据包的高性能处理。具体体现在DPDK应用程序是运行在用户空间上利用自身提供的数据平面库来收发数据包,绕过了Linux内核协议栈对数据包处理过程。目前出现了很多基于DPDK的高性能网络框架,OVS 和 VPP 是常用的数据包处理框架,mTCP和 f-stack 是常用的用户态协议栈。

2. DPDK基本原理

在Linux操作系统中,首先网卡通过中断方式通知协议栈对数据包进行处理,协议栈先会对数据包进行合法性进行必要的校验,然后判断数据包目标是否本机的socket,满足条件则会将数据包拷贝一份向上递交给用户socket来处理,不仅处理路径冗长,还需要从内核到应用层的一次拷贝过程,基本流程如图1所示,但当大量数据到来时,会触发频繁的软中断(softirq)导致系统无法承受,需要把包从内核缓冲区拷贝到用户缓冲区,带来系统调用和数据包复制的开销,对于很多网络功能节点来说,TCP/IP协议并非是数据转发环节所必需的,NAPI/Netmap等虽然减少了内核到用户空间的数据拷贝,但操作系统调度带来的cache替换也会对性能产生负面影响。

内核收发包流程
而DPDK是运行在用户空间上利用自身提供的数据平面库来收发数据包,绕过了Linux内核协议栈对数据包处理过程。Linux内核将DPDK应用程序看作是一个普通的用户态进程,包括它的编译、连接和加载方式和普通程序没有什么两样。如图2所示DPDK包处理流程绕过了内核直接到用户层进行处理,区别于传统的数据包先到内核最后再到用户层。
DPDK收发包流程

3. DPDK特性

3.1. PMD

PMD(Poll Mode Driver) 轮询模式驱动是DPDK基于用户态的轮询机制,该驱动由API、用户空间运行的驱动程序构成,该驱动使用无中断方式直接操作网卡的接收和发送队列(除了链路状态通知仍必须采用中断方式以外)。目前PMD驱动支持Intel的大部分1G、10G和40G的网卡。PMD驱动从网卡上接收到数据包后,会直接通过DMA方式传输到预分配的内存中,同时更新无锁环形队列中的数据包指针,不断轮询的应用程序很快就能感知收到数据包,并在预分配的内存地址上直接处理数据包,这个过程非常简洁。

3.2. UIO

UIO(Userspace I/O)是用户空间下驱动程序的支持机制。DPDK使用UIO机制使用网卡驱动程序运行在用户态,并采用轮询和零拷贝方式从网卡收取报文,提高收发报文的性能。UIO指的是运行在用户空间的I/O技术,是实现用户空间下驱动程序的支撑机制。Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用程序调用即可,而UIO则是将驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能。使用UIO可以避免设备的驱动程序需要随着内核的更新而更新的问题。由于DPDK是应用层平台,所以与此紧密相连的网卡驱动程序(主要是intel自身的千兆igb与万兆ixgbe驱动程序)都通过uio机制运行在用户态下。 Intel DPDK 的igb_uio内核模块依赖于内核的UIO

3.3. NUMA

NUMA(Non-Uniform Memory Access Architecture)即非一致性内存访问技术。NUMA系统将CPU划分成不同的组(Node),每个Node由多个CPU组成,并且有独立的本地内存、I/O等资源。Node之间通过互联模块连接和沟通,因此除了本地内存外,每个CPU仍可以访问远端Node的内存,只不过效率会比访问本地内存差一些,我们用Node之间的距离来定义各个Node之间互访资源的开销。
NUMA系统架构.

node是一个逻辑上的概念,一个node可以包含一个或多个socket。

#查看node个数
lscpu | grep "node(s)"
NUMA node(s):        1

socket是指主板上物理CPU的插槽,所以socket的个数与物理CPU个数相同

#查看socket个数
lscpu | grep "Socket(s)"
Socket(s):           1

core的中文意思是核心,它就是我们平时说的,一个cpu中有几核的核的概念,其实在很久之前是没有core的概念的,一个cpu就是一个完整的物理处理单元,之后由于多核技术的发展,cpu的概念转变为了一个容器,而core则变成了真正的物理处理单元,一个cpu中可以有多个core,各个core之间是相互独立,且可以并行执行逻辑的,每个core都有自己单独的寄存器,l1, l2 缓存等物理硬件。

#每个物理CPU上有多少个core
lscpu | grep "Core(s)"
Core(s) per socket:  2

线程数是指单个core在同一时刻能并行执行的程序个数,为了能够让单个 core 在同一时刻能够执行的多个程序,于是出现了多线程技术(SMT,simultaneous multithreading)和超线程技术(HT, Hyper-Threading),可以通过以下两种方式,判断是否是启用多线程或者超线程。

  • siblings表示位于相同物理cpu中的逻辑cpu的数量,cpu cores表示位于相同物理cpu中的core的数量,如果cpu cores=siblings/2,说明启动了多线程或者超线程;如果cpu cores=siblings,则没有启用多线程或者超线程。
#判断是否开启超线程
cat /proc/cpuinfo | grep -e "cpu cores" -e "siblings" | sort | uniq
cpu cores : 2
siblings : 4
  • 如果一个core上的线程数大于1,说明启用了多线程或者超线程。
#每个core上有多少个线程
lscpu | grep "Thread(s)"
Thread(s) per core:  2

综上所述,一个NUMA node可以有一个或者多个socket,一个多核socket显然包含多个core,如果启用多线程或者超线程则一个core会变成多个core,所以它们之间的关系如下:
逻辑 c p u 数 = n o d e 数 ∗ 物理 c p u 数 ∗ 每颗物理 c p u 的核心 c o r e 数 ∗ 每个核心的线程数 逻辑 cpu 数 = node数 * 物理 cpu 数 * 每颗物理 cpu 的核心core数 * 每个核心的线程数 逻辑cpu=node物理cpu每颗物理cpu的核心core每个核心的线程数

Node、Socket、Core、HT之间的关系

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_34342887/article/details/131691102

智能推荐

VINS-Mono代码阅读笔记(二):feature_tracker代码阅读_image discontinue! reset the feature tracker!-程序员宅基地

文章浏览阅读3.8k次,点赞14次,收藏22次。1.入口main函数feature_tracker结点的入口函数为feature_tracker_node.cpp文件中的main函数。main函数代码如下:/** * feature_tracker_node的入口函数*/int main(int argc, char **argv){ ros::init(argc, argv, "feature_tracker");..._image discontinue! reset the feature tracker!

古堡算式ABCDE * ? = EDCBA-程序员宅基地

文章浏览阅读1.7k次。/*福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式: ABCDE * ? = EDCBA 他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!” 华生:“我猜也是!” 于是,两人沉默了好久,还是没有算出合适的结果来。 请你利用计算机的优势,找到破解的答案。 把 ABCDE 所代表的数字写出来。*/ #includ_abcde * ?

tensorflow中常用的变量初始化方法_tensorflow 创建一个初始为均匀分布的变量-程序员宅基地

文章浏览阅读3.6k次。1. 初始化为常量tf.constant_initializer__init__( value=0, #指定的常量 dtype=tf.float32, #数据类型 verify_shape=False #是否可以调整tensor的形状,默认可以调整)#常量初始化#tf.constant_initializerva..._tensorflow 创建一个初始为均匀分布的变量

g2o学习记录(3)源码下的example例子运行_g2o example-程序员宅基地

文章浏览阅读2.4k次,点赞4次,收藏5次。g2o(3)源码下的example例子运行  由于我使用的是Cmake3.5.1版本,高版本必须加上cmake_minimum_required(VERSION 3.5)  第一次运行cmake命令的时候会出现:/usr/bin/cmake -DCMAKE_BUILD_TYPE=Debug -G "CodeBlocks - Unix Makefiles" /home/tanqiwei/D..._g2o example

十四届蓝桥杯EDA科目客观题汇总_蓝桥杯eda真题-程序员宅基地

文章浏览阅读2.7w次,点赞156次,收藏895次。这是我自己搜集的部分十四届之前的蓝桥杯eda科目的真题和模拟题,有部分答案解释是我自己写的,所以经供参考。_蓝桥杯eda真题

textFormat失效问题的解决。-程序员宅基地

文章浏览阅读147次。import flash.text.TextField;import flash.text.TextFormat;var label:TextField = new TextField();var labelCss:TextFormat = new TextFormat();labelCss.color = "0xff0000";labelCss.leading = 5;labelCss...._format text as code点了没反应

随便推点

01背包、完全背包、多重背包、分组背包问题,一文读懂_01背包方案-程序员宅基地

文章浏览阅读2.3k次,点赞4次,收藏15次。背包问题是一种组合优化的 NP 完全问题:有 N 个物品和容量为 W 的背包,每个物品都有自己的体积 w 和价值 v,求拿哪些物品可以使得背包所装下物品的总价值最大。0-1背包有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。每件物品都有选与不选两种情况,那么这个问题完全可以用回溯法来暴力搜索,时间复杂度为O(n2)O(n^2)O(n2),因为暴力解法时间复杂度太高,所以才要用_01背包方案

【04多媒体基础参数】_1分钟的视频信息,要求每秒播放30帧 每帧分辨率为1024*1024,视频的采样率为4比-程序员宅基地

文章浏览阅读246次。04多媒体基础参数参数定义比特率:音视频、图像都可以采用这个指标,它指的是规定时间内传输的比特数,单位是 bps(bit per second),比特率越高,数据传输的速度就越快,流媒体的播放质量就越好(音视频越清晰),所需带宽也越大,比特率有时候也和码率混为一谈,但码率的单位一般是 kbps(千位每秒)采样率:专用于音频多媒体,也称为采样速度或者采样频率,它定义了每秒从连续信号中提取并组成离散信号的采样个数,单位为赫兹(Hz)。采样率的意义在于将模拟信号转换成数字信号时的采样频率,也就是单_1分钟的视频信息,要求每秒播放30帧 每帧分辨率为1024*1024,视频的采样率为4比

python的string模块(字符)和random模块的使用_import string在python中的用法-程序员宅基地

文章浏览阅读2.2k次,点赞3次,收藏18次。一、模块string的简单使用import string #导入string模块,获取大小写字母、特殊字符、数字等#获取大小写字母abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZprint(string.ascii_letters)#获取大写字母ABCDEFGHIJKLMNOPQRSTUVWXYZprint(string.ascii_uppercase)#获取小写字母abcdefghijklmnopqrstuvwxyzprint(s_import string在python中的用法

IntelliJ IDEA导入 Eclipse 项目【山东大学 现代软件开发技术】2023.2.2 Ulitimate Edition_idea导入eclipse-程序员宅基地

文章浏览阅读1.2k次,点赞3次,收藏8次。本文记录了将 Eclipse 项目 导入 IDEA 2023.2.2 的过程,同时也适用于山东大学现代软件开发技术这门课的开发环境迁移。_idea导入eclipse

Chrome浏览器调试教程_chrome 浏览器调试协议-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏2次。Chrome浏览器及调试教程引言在web开发过程中,我们在写JavaScript脚本时难免会遇到各种bug,这时,我们就需要去调试我们的JavaScript脚本,然后去修改代码。最简单的调试方法就是使用alert方法,将可信息通过alert方法的弹窗显示出来。但是,alert方法有几个弊端:1)alert方法在弹..._chrome 浏览器调试协议

【小程序开发必备】微信小程序常用API全介绍,附示例代码和使用场景_微信小程序代码大全-程序员宅基地

文章浏览阅读1.1w次,点赞64次,收藏180次。本篇博文介绍了微信小程序常用API,包括网络请求、数据缓存、交互反馈、设备、媒体、界面、开放接口等方面。每个API都附有详细的介绍和示例代码,以及使用场景。这些API可以帮助小程序开发者快速实现各种功能和交互效果,是小程序开发的必备工具。无论是初学者还是有一定经验的开发者,都能从本篇博文中学到很多实用的技巧和知识。_微信小程序代码大全

推荐文章

热门文章

相关标签