我在一篇博文中看到DPDK的解释为内核旁路技术,我觉得这个解释很形象也很好记,DPDK 重载了网卡驱动,将数据包的控制平面和数据平面分离,驱动在收到数据包后不再硬中断通知 CPU,而是让数据包通过内核旁路的协议栈绕过了 Linux 内核协议栈,并通过零拷贝技术存入内存,这时应用层的程序就可以通过 DPDK 提供的接口读取数据包。
- DPDK:DPDK is the Data Plane Development Kit that consists of libraries to accelerate packet processing workloads running on a wide variety of CPU architectures.
- uio:Userspace I/O运行在用户空间的I/O技术,是实现用户空间下驱动程序的支撑机制。DPDK使用UIO机制使用网卡驱动程序(主要是Intel的千兆igb和万兆ixgbe驱动程序)运行在用户态,并采用轮询和零拷贝方式从网卡收取报文,提高收发报文的性能。
- VFIO: UIO不支持DMA,所以通过DMA传输大流量数据的IO设备,如网卡、显卡等设备,无法使用UIO框架,VFIO做为UIO的升级版,主要就是解决了这个问题。通过用户态配置IOMMU接口,可以将DMA地址空间映射限制在进程虚拟空间中。这对高性能驱动和虚拟化场景device passthrough尤其重要。
- kni: Kernel NIC Interface内核网卡接口,是DPDK允许用户态和内核态交换报文的解决方案,例如DPDK的协议栈是专门处理DNS报文,其余的报文通过KNI接口返回给内核来处理。
- hugepage:初衷是为包处理的缓冲区分配更大的内存池,降低页表的查询负载,提高TLB的命中率,减少了虚拟页地址到物理页地址的转换时间。大内存页最好在启动的时候进行分配,这样可以避免物理空间中有太多的碎片。
EAL 用函数mmap() 在 hugetlbfs 中申请physical memory allocation. 可以在hugepage中存储LPM表等。 - numa: Non-Uniform Memory Access非一致性内存访问,是一种多CPU和内存及总线之间的一种架构。越来越多的 CPU 对前端总线的争用,使前端总线成为了瓶颈。为了消除 UMA 架构的瓶颈,NUMA架构应运而生:CPU 厂商把内存控制器集成到 CPU 内部,一般一个 CPU socket 会有一个独立的内存控制器。每个 CPU scoket 独立连接到一部分内存,这部分 CPU 直连的内存称为“本地内存”。CPU 之间通过 QPI(Quick Path Interconnect) 总线进行连接。CPU 可以通过 QPI 总线访问不和自己直连的“远程内存”。
- rte(run time environment) 运行时环境
- Environment Abstraction Layer (EAL), which may be specific to a mode of the Intel® architecture (32-bit or 64-bit), Linux* user space compilers or a specific platform.摘自《Programmer’s Guide》
- lcore:an EAL thread, which is really a Linux/FreeBSD pthread. “EAL pthreads” are created and managed by EAL and execute the tasks issued by remote_launch. In each EAL pthread, there is a TLS (Thread Local Storage) called _lcore_id for unique identification. As EAL pthreads usually bind 1:1 to the physical CPU, the _lcore_id is typically equalto the CPU ID.
- PMD: a Poll Mode Driber consists of APIs, provided through the BSD driber running in user space, to configure the devices and their respective queues. In addition, a PMD accesses the RX and TX descriptors directly without any interrupts to quickly receive, process and deliver packets in the user's application.
- EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。 EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。一般用在即插即用。
- service cores: 服务核心概念建立在service(DPDK中需要CPU周期才能运行的组件)和service cores(DPDK lcores,负责运行服务)之上。service cores概念的强大之处在于,可以配置服务核心和服务之间的映射,以抽象出平台和环境之间的差异。初步理解为跑service程序和cores之间的映射关系,可以是n个service程序跑在m个cores之上。对于dpdk程序可以用 -s 来指定service cores.
- mempool: A memory pool is an allocator of a fixed-sized object. In the DPDK, it is identified by name and uses a mempool handler to store free objects. The default mempool handler is ring based.
- mbuf: Mbufs are the packet buffer structure used by DPDK. The message buffers are stored in a mempool, using the Mempool Library.
- Time-Stamp Counter (TSC)
- LPM: the Longest Prefix Match, DPDK LPM库组件为32位密钥实现了最长的前缀匹配(LPM)表搜索方法,该方法通常用于查找IP转发应用程序中的最佳路由匹配。最长的前缀匹配表用于存储/查找与该IP地址关联的传出端口号。任何不匹配的数据包都会被转发到原始端口。
- Direct and Indirect Buffers:直接缓冲区是一个完全独立和独立的缓冲区。间接缓冲区的行为类似于直接缓冲区,但由于其中的缓冲区指针和数据偏移量指向另一个直接缓冲区中的数据。当缓冲区使用rte_pktmbuf_attach()函数“附加”到直接缓冲区时,它将成为间接的。每个缓冲区都有一个参考计数器字段,当一个间接缓冲区附加到直接缓冲区时,直接缓冲区上的参考计数器就会递增。类似地,每当分离间接缓冲区时,直接缓冲区上的参考计数器就会减少。如果生成的引用计数器等于0,则直接缓冲区将被释放,因为它不再被使用。这在包需要重复或碎片的情况下很有用,因为间接缓冲区提供了跨多个缓冲区重用相同包数据的方法。
NUMA理解
以我们的测试服务器为例来进行举例说明:这台普通的R630服务器一共有两颗CPU,128G内存,其中内存是均匀分布在两颗CPU上的,即每颗CPU的内存总线都对应连接着64G的内存。那么NUMA打开和关闭的区别在哪里呢?
对于关闭NUMA的机器,在Linux系统中查看的时候只有一个NUMA节点,系统会以为只有一颗CPU,那么这128G内存就都是这一颗CPU的,这样的好处是在应用程序可以通过操作系统跨NUMA节点调度另外一颗CPU的内存,虽然一颗CPU只有64G内存的,但是在这个CPU上面运行的程序可以调用128G的内存,实在不够了再调用SWAP内存。对于一般的应用程序来说,即使是使用了另外一颗CPU的内存会带来较高的延时,但是性能也远比swap内存强多了。
对于打开NUMA的机器,在本身的CPU内存用尽的情况下,不会去跨NUMA节点调度另外一颗CPU的内存,而是直接调用swap内存。对于DPDK程序来说,这样的好处就是尽可能地降低内存的延迟,提高性能表现。由于DPDK广泛的使用了大页内存(HugePage),可以有效地控制内存的超用问题,不会涉及到swap内存的调用。
LPM理解
LPM包含有224个入口的一级表和多个有28入口的二级表。每个条目有效标志设置为1时表示此条目正在使用中,外部条目标志设置为0时表示查找过程此时结束。tbl24是匹配前24位的,tbl8是匹配最后8位的。
标签:入门,service,NUMA,基本概念,内存,缓冲区,CPU,DPDK From: https://www.cnblogs.com/janeysj/p/15029450.html