logo资料库

DPDK学习之基础概念介绍.docx

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
前言
第一章 一些基本概念
1.1Linux环境下的UIO( Userspace I/O )
1.2大内存页(Hugepages)机制
1.2.1大页内存介绍
1.2.2大页内存分类
1.2.3大页内存使用
1.2.4大页内存配置脚本
1.3TLB
1.4CPU的物理核,逻辑核概念
1.4.1物理处理器封装个数
1.4.2处理器核心数
1.4.3逻辑处理器数
1.4.4SIBLING
1.4.5超线程
1.5CPU亲和性
1.6 NUMA机制
前言 DPDK 是专为快速收发包所开发的一系列的库文件和驱动代码。可以在 Intel 的芯片上 运行。可以用来  在极短的时间里面完成收发包  可以开发快速的抓包算法。  可以运行第三方的快速路径栈 而 DPDK 最大的优点就是改进小封包吞吐量与作业负荷效能,传统的网路架构都是针对 大封包吞吐量进行最佳化,而 Intel® DPDK 可以解决小封包所带来效能不佳的问题。 除了应用在企业终端外, Intel DPDK 也可以在软体定义网路 (SDN) 与网路功能虚拟化 (NFV) 中扮演着重要的角色。 本文主要是对官方提供的《intel-dpdk-getting-started-guide Revision-002》进行总结,提 取其中的关键知识点。同时对一些知识点进行了延伸,方便新手对 DPDK 的一些相关概念 有个基本的认识,对整个 DPDK 的安装过程有个整体的认识 第一章 一些基本概念 刚开始接触 DPDK 的时候,会遇到很多基本的概念,通过后面的测试实践发现,很多 时候都是由于基本概念不明导致错误不能被检查出来,所有本文总结了一些相关的概念,同 时对概念下面的一些子概念也进行了一定的延伸。 1.1Linux 环境下的 UIO( Userspace I/O ) UIO 用户空间下驱动程序的支持机制。DPDK 使用 UIO 机制使用网卡驱动程序(主要 是 Intel 的千兆 igb 和万兆 ixgbe 驱动程序)运行在用户态,并采用轮询和零拷贝方式从网卡 收取报文,提高收发报文的性能。 UIO 指的是运行在用户空间的 I/O 技术,是实现用户空间下驱动程序的支撑机制。 Linux 系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用程序调用即可, 而 UIO 则是将驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能。 使用 UIO 可以避免设备的驱动程序需要随着内核的更新而更新的问题。 由于 DPDK 是应用层平台,所以与此紧密相连的网卡驱动程序(主要是 intel 自身的千 兆 igb 与万兆 ixgbe 驱动程序)都通过 uio 机制运行在用户态下。 Intel® DPDK 的 igb_uio 内核模块依赖于内核的 UIO。 需要以模块方式编译 可以通过如下命令进行编译 sudo /sbin/modprobe uio
1.2大内存页(Hugepages)机制 1.2.1 大页内存介绍 Dpdk 使用大页内存的初衷是为包处理的缓冲区分配更大的内存池,降低页表的查询负 载,提高 TLB 的命中率,减少了虚拟页地址到物理页地址的转换时间。 大内存页最好在启动的时候进行分配,这样可以避免物理空间中有太多的碎片。 1.2.2 大页内存分类 Linux 操作系统的大页内存,主要分为 2M 和 1G 大小。可以从 CPU 的标识中看出支持 大内存页的类型。 如果有 “pse”的标识,说明支持 2M 的大内存页。 如果有“pdpe1gb”的标识,说 明支持 1G 的大内存页,64 位机建议使用 1GB 的大页。 比如如果想设置一个 4G 的大内存页,而且这个大内存页由 4 个 1G 大小的页构成,可 以把如下配置传递给内核。 default_hugepagesz=1G hugepagesz=1G hugepages=4 但是如果使用大量的大内存页的话,最好增加当前登录会话打开文件限制,以减少运行 DPDK 程序时发生的错误。可以使用 ulimit 的命令,比如 ulimit -Sn 2048。 在两插槽的 NUMA 系统中, 大内存页会在两个插槽的 CPU 中进行平均分配。 echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages。 对于 NUMA 系统,需要对每个服务器都进行分配,使用命令 echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages 1.2.3 大页内存使用 如果已经配置好了大内存页机制,就可以让 DPDK 利用大内存页的机制了。 可以输入如下的命令 mkdir /mnt/huge mount -t hugetlbfs nodev /mnt/huge 在运行程序的时候,最好把分配给大页的所有空间都利用起来。如果 DPDK 的程序在 运行的时候传递了-m 或者--socket-mem 的参数,大内存页的分配在启动的时候会自动加载。 如果传递给程序的内存页数量比程序要求的要少,也就是内存页不够用,程序将会中止。 但是,如果用户要求的内存空间小于预留的内存空间时,同样有可能出现程序崩溃的情况。 原因如下, 假设系统为 Socket1 和 Socket 0 各预留了 1024 个大内存页。
如果用户需要 128M 的内存,也就是 64 个大内存页,但是这 64 个大页可能有以下的限 制:  这 64 个大页可能都被分配给 Socket 1,如果用户要求访问 Socket 0 的内存,程序 中止。为了避免这个问题,尽量使用--socket-mem 的选项,而不是-m。  这些页面可能被分配到物理内存的任何地方,尽管 Intel® DPDK EAL 会尽力分配 临近的内存块,但是还是不可避免的会遇到不临近的情况,在这种情况下可能不能 分配大内存池。 socket-mem 这 个 选 项 是 用 来 为 每 个 CPU 的 Socket 分 配 特 定 的 内 存 大 小 的 。 比 如 --socket-mem=0,512,其中 0 是表示给 Socket 0 分配 0MB ,512 表示给 Socket 1 分配 512MB 内存大小。同理对拥有 4 个 Socket 的系统,如果要给 Socket 0 ,2 都分配 1GB 的内存大小, 可以使用下面的选项配置:--socket-mem=1024,0,1024 1.2.4 大页内存配置脚本 1、创建大页内存挂接点 mkdir /mnt/huge_1GB mount -t hugetlbfs nodev /mnt/huge_1GB 2、在/etc/fstab 文件中加入如下命令,使其重启后有效 nodev /mnt/huge_1GB hugetlbfs pagesize=1GB 0 0 3、在 CentOS 7.0,修改/etc/grub2.cfg 文件中启动菜单的内核参数: 查找关键字"menuentry"启动项,定位到"linux16 /vmlinuz-3.10.0-327.el7.x86_64" 在其末尾添加"default_hugepagesz=1G hugepagesz=1G hugepages=4" (测试发现在 hugepages=4 一般不会生效!可设置成系统允许的合适的值) 4、启动机器后 cat /proc/meminfo|grep Huge 可以看到 Hugepagesize 已经设置成 1GB 如果 HugePages_Total 为 0,以设置 16GB 为例 使用 sysctl -w vm.nr_hugepages=16 这样就设置了 16GB 的大页面,此时 HugePages_Total=16 1.3TLB 其中 TLB(Translation Lookaside Buffer)称为页表缓冲,是一个存放着页表缓存(虚拟地 址到物理地址的转换表)的内存管理单元,用于改进虚拟地址到物理地址转换速度。 X86 体系的系统内存里存放了两级页表,第一级页表称为页目录,第二级称为页表。由 于“页表”存储在主存储器中,查询页表所付出的代价很大,由此产生了 TLB。 TLB 是内存里存放的页表的缓存,那么它里边存放的数据实际上和内存页表区的数据 是一致的,在内存的页表区里,每一条记录虚拟页面和物理页框对应关系的记录称之为一个 页表条目(Entry),同样地,在 TLB 里边也缓存了同样大小的页表条目(Entry)。 1:TLB 在 X86 体系的 CPU 里的实际应用最早是从 Intel 的 486CPU 开始的,在 X86 体
系的 CPU 里边,一般都设有如下 4 组 TLB: 第一组:缓存一般页表(4K 字节页面)的指令页表缓存(Instruction-TLB); 第二组:缓存一般页表(4K 字节页面)的数据页表缓存(Data-TLB); 第三组:缓存大尺寸页表(2M/4M 字节页面)的指令页表缓存(Instruction-TLB); 第四组:缓存大尺寸页表(2M/4M 字节页面)的数据页表缓存(Data-TLB); 2:TLB 命中和 TLB 失败 如果 TLB 中正好存放着所需的页表,则称为 TLB 命中(TLB Hit); 如果 TLB 中没有所需的页表,则称为 TLB 失败(TLB Miss)。 当 CPU 收到应用程序发来的虚拟地址后, 首先到 TLB 中查找相应的页表数据,如果 TLB 中正好存放着所需的页表,则称为 TLB 命中(TLB Hit) 接下来 CPU 再依次看 TLB 中页表所对应的物理内存地址中的数据是不是已经在一级、 二级缓存里了,若没有则到内存中取相应地址所存放的数据。 1.4CPU 的物理核,逻辑核概念 使用 DPDK 时经常进行 CPU 的 core 分配,本小节将对 CPU 的物理核,处理器,逻辑 核的概念进行简单的介绍。 一个物理封装的 CPU(通过 physical id 区分判断)可以有多个核(通过 core id 区分判 断)。而每个核可以有多个逻辑 cpu(通过 processor 区分判断)。一个核通过多个逻辑 cpu 实现这个核自己的超线程技术。 1.4.1 物理处理器封装个数 物理处理器封装个数,即俗称的“物理 CPU 数”. 例如一块“Intel Core i3-2310M”只有 1 个“物理处理器”。若对于有多个处理器插槽 的服务器,“物理处理器”很可能会大于 1。 可以使用如下命令查询物理处理器的封装个数。 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l 具有相同 physical id 的 CPU 是同一个 CPU 封装的线程或核心 使用 lscpu 命令可以 NUMA 架构下 CPU node0 和 node1 的 core 分配情况。 1.4.2 处理器核心数 processor cores,即俗称的“CPU 核心数”,也就是每个物理 CPU 中 core 的个数 例如“Intel Core i3-2310M”是双核处理器,它有 2 个“处理器核心数”。 可以通过以下的命令来查看:
cat /proc/cpuinfo| grep "cpu cores"| uniq 具有相同 core id 的 CPU 是同一个 core 的超线程 1.4.3 逻辑处理器数 逻辑处理器数英文名是 logical processors,即俗称的“逻辑 CPU 数”, 逻辑核心处理器,就是虚拟物理核心处理器的一个超线程技术 例如“Intel Core i3-2310M”支持超线程,一个物理核心能模拟为两个逻辑处理器,即 一块“Intel Core i3-2310M”有 4 个“逻辑处理器数”。 可以使用 cat /proc/cpuinfo| grep "processor"| wc -l 1.4.4 SIBLING SIBLING 是内核认为的单个物理处理器所有的超线程个数,也就是一个物理封装中的 逻辑核的个数。 如果 SIBLING 等于实际物理核数的话,就说明没有启动超线程,反之启用超线程。 也就是说使用 cat /proc/cpu 命令(这条指令在 centos7 上无法执行)  如果“siblings”和“cpu cores”一致,则说明不支持超线程,或者超线程未打开。  如果“siblings”是“cpu cores”的两倍,则说明支持超线程,并且超线程已打开 图中,“siblings”是“cpu cores”的两倍,则说明支持超线程。 1.4.5 超线程 超线程全名为 Hyper-Threading,利用特殊的硬件指令,把两个逻辑内核模拟成两个物 理芯片,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了 CPU 的闲置时间,提高的 CPU 的运行速度。 采用超线程即是可在同一时间里,应用程序可以使用芯片的不同部分。 虽然单线程芯片每秒钟能够处理成千上万条指令,但是在任一时刻只能够对一条指令进 行操作。而超线程技术可以使芯片同时进行多线程处理,使芯片性能得到提升。 虽然采用超线程技术能同时执行两个线程,但它并不象两个真正的 CPU 那样,每个 CPU 都具有独立的资源。当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资 源,直到这些资源闲置后才能继续。因此超线程的性能并不等于两颗 CPU 的性能。 如果有两个逻辑 CPU 具有相同的”core id”,那么超线程是打开的。
1.5CPU 亲和性 CPU 的亲和性也就是 cpu affinity 机制,指的是进程要在指定的 CPU 上尽量长时间地 运行而不被迁移到其他处理器, 通过处理器关联可以将虚拟处理器映射到一个或多个物理 处理器上 ,也就是说把一个程序绑定到一个物理 CPU 上。 在越来越多核心的 cpu 机器上,提高工作效率的最直观做法就是让各个 cpu 核心各自干 专门的事情。 而且在多核运行的机器上,每个 CPU 本身自己会有缓存,缓存着进程使用的信息,而 进程可能会被 OS 调度到其他 CPU 上,如此,CPU cache 命中率就低了。当一个进程或线程 绑定 CPU 后,程序就会一直在指定的 cpu 跑,不会由操作系统调度到其他 CPU 上, 减少了 cpu 的缓存,也减少了进程或者线程的上下文切换,从而提高性能和效率。 另一种场景使用绑核考虑,是将重要的业务进程隔离开,对于部分实时进程调度优先级 高,可以将其绑定到一个指定核上,既可以保证实时进程的调度,也可以避免其他 CPU 上 进程被该实时进程干扰。 DPDK 利用 cpu affinity 主要是将控制面线程以及各个数据面线程绑定到不同的 cpu,省 却了来回反复调度的性能消耗,线程之间互不干扰的完成工作。 1.6 NUMA 机制 查看系统是否支持 NUMA 机制 grep -i numa /var/log/dmesg NUMA 即”非一致性内存访问”,Linux 提供了一个命令 numactl,可以用来查看系统的 numa 状态.
系统共有两个 node,分别领取了 16 个 cpu,和 128G 内存(近似值),一个物理 cpu 对应一个 node,也就是说如果服务器只有一个物理 cpu,那么就只有一个 node0,领取系统全部的内存和 cpu(近似值). Numastat 命令可以查看 numa 状态 如果图中的 oter_node 过高,需要重新规划 NUMA. NUMA 的基本原理 随着电脑要处理的事务越来越多,Cpu 的的频率朝着越来越高的方向发展.
CPU 访问自身直接 attach 内存对应的物理地址时,才会有较短的响应时间,俗称 Local Access, 如图标识的”fast”,如果需要访问其他 cpu attach 的内存的数据时,就需要通过 inter-connect 通 道来访问,相比之前的访问速度要慢一些,俗称 Remote Access ,如图标识的”slow”,那么在 dpdk 的使用过程中,配置 NUMA 模式和 NoNUMA 模式是加快访问速度的方法而已。 NUMA 调度器负责将进程在同一个节点的 CPU 间调度,除非负载过高,才迁移到其它节点 上。 Nodes :Node 是 NUMA 体系中的概念。通过划分 node,每个 node 有本地 RAM,这样 node 内访问 RAM 速度会非常快。但跨 Node 的 RAM 访问代价会相对高一点。每个 node 内部有 自己的 CPU 总线和内存。
分享到:
收藏