DPDK基本技术一:

来源:互联网 发布:广东新闻频道 大数据 编辑:程序博客网 时间:2024/05/03 06:08

Linux环境下的UIO(userspace I/O)

UIO指的是运行在用户空间的I/O技术,是实现用户空间下驱动程序的支撑机制。
Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用程序调用即可,而UIO则是将驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能。使用UIO可以避免设备的驱动程序需要随着内核的更新而更新的问题。
由于DPDK是应用层平台,所以与此紧密相连的网卡驱动程序(主要是intel自身的千兆igb与万兆ixgbe驱动程序)都通过uio机制运行在用户态下。 Intel® DPDK 的igb_uio内核模块依赖于内核的UIO,需要以模块方式编译,可以通过如下命令进行编译:

sudo /sbin/modprobe uio

大页内存

大页内存是为包处理的缓冲区缓冲区分配更大的大内存池,利用大内存页的主要好处当然是通过利用大内存页提高内存使用效率。可以得到明显的性能提高,因为需要更少的页,更少的TLB( Translation Lookaside Buffers),减少了虚拟页地址到物理页地址的转换时间。如果不使用大内存页机制的话,TLB的命中率会降低,反而会降低性能。

大内存页最好在启动的时候进行分配,这样可以避免物理空间中有太多的碎片,提高发包的效率。普通的页大小为4KB, 默认的大内存页的大小为2MB,也可以设置其他的大内存页大小,可以从CPU的标识中看出支持哪种大内存页。如果有 “pse”的标识,说明支持2M的大内存页。 如果有“pdpe1gb”的标识,说明支持1G的大内存页。 如果64位机建议使用1GB的大页。

比如如果想设置一个4G的大内存页,而且这个大内存页由4个1G大小的页构成,可以把如下配置传递给内核:

default_hugepagesz=1G hugepagesz=1G hugepages=4 

但是如果使用大量的大内存页的话,最好增加当前登录会话打开文件限制,以减少运行DPDK程序时发生的错误。可以使用ulimit的命令,比如:
ulimit -Sn 2048

在两插槽(物理处理器封装个数sockets)的NUMA系统中, 大内存页会在两个插槽的CPU中进行平均分配。
对于2MB的大内存页的情况,也可以在系统启动以后再进行大内存页的分配。在NON-NUMA系统, 使用命令

echo 1024 > /sys/kernel/mm/hugepages/hugepage2048kB/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

对于1G的大内存页,不能在系统启动以后进行分配。

系统中分配的大内存页:
大内存页

使用大内存页:
如果已经配置好了大内存页机制,就可以让DPDK利用大内存页的机制了。可以输入如下的命令:

mkdir /mnt/hugemount -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

TLB:

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中页表所对应的物理内存地址中的数据是不是已经在一级、二级缓存里了,若没有则到内存中取相应地址所存放的数据。

原创粉丝点击