只有两次缓存未命中才能激活预取机制,两次之间的内存地址偏差不超过256或512字节。 4KB页面中只定义1个流,可同时独立跟踪8个流。在4KB 边界之外不执行预取。对于强不可缓存和写组合内存类型,将预取的数据放入二级或三级缓存并不一定会提高性能。硬件预取并不一定会提高性能,因此DPDK还使用软件预取来尝试将数据放入缓存中。此外,DPDK在定义数据结构时还确保缓存行对齐。
缓存一致性
原则是避免多个核心访问相同的内存地址或数据结构。数据结构方面:每个核心都有独立的数据结构。多个核心访问同一个网卡:每个核心创建一个单独的接收队列和发送队列。
Huge Page
巨大的LBFS有两个好处:
首先是使用大页内存需要更少的页表条目,这对于需要大量内存的进程来说节省了大量的开销。 Oracle等大型数据库采用大页配置进行优化;第二个是TLB冲突的概率。减少,TLB是CPU中的一个独立的高速缓存,使用hugepage可以大大减少TLB miss的开销。 DPDK目前支持hugepage两种模式,2M和1G。通过修改默认/etc/grub.conf中的hugepages配置为default_hugepagesz=1G Hugepagesz=1G Hugepages=32 isolcpus=0-22,然后通过mount t Hugetlbfs nodev /mnt挂载Hugepage文件系统hugetlbfs到/mnt/上/huge 巨大目录,那么用户进程就可以使用mmap来映射hugepage目标文件来使用大页。测试表明,使用大页表的应用程序比使用4K页表的性能提高了10%-15%。
Linux系统启动后如何保留大页面
非NUMA 系统: echo 1024 /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepagesNUMA 系统: echo 1024 /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages 对于1G 大页,必须be in 系统启动时指定,不能动态保留。
Data Direct I/O (DDIO)
DDIO允许外部网卡和CPU通过LLC缓存直接交换数据,绕过内存,提高CPU处理数据包的速度。
在Intel E5系列产品中,LLC Cache的容量已经增加到20MB。
NUMA
DPDK充分利用NUMA的特点
每核心内存,每个核心都有自己的内存。一方面,它需要本地内存。另一方面,使用本地处理器和本地内存处理本地设备上产生的数据也是为了缓存一致性q=rte_zmalloc_socket('fm10k ', sizeof(*q), RTE_CACHE_LINE_SIZE, socket_id) 的几个概念CPU核心:
处理器核心数(cpu cores):每个物理CPU核心的数量逻辑处理器核心数(siblings):单个物理处理器的超线程数系统物理处理器包ID(physical id):也称为socket插入槽位,物理机处理器包数量,物理CPU数量。系统逻辑处理器ID(处理器):逻辑CPU的数量,这是物理处理器的超线程技术CPU亲和力。
将进程与CPU绑定可以提高Cache命中率,从而减少内存访问损失。 CPU亲和力的主要应用场景是
大量计算场景运行时间敏感且确定性的线程,即实时线程相关工具
sched_set_affinity()、sched_get_affinity() 内核函数taskset命令isolcpus 内核启动参数:CPU绑定后仍然可能发生线程切换。可以使用isolcpus=2,3 将CPU 与内核调度系统分开。 DPDK 中的CPU 亲和力
DPDK中的lcore实际上是一个EAL pthread。每个EAL pthread都有一个线程本地存储的_lcore_id。 _lcore_id与CPU ID一致。注意,虽然默认关系是1:1,但是可以通过--lcores='lcore_set@cpu_set'指定lcore的CPU亲和力,这样就不需要是1:1了,即多个lcore仍然可以亲和同一个核。这个需要注意调度情况(以非抢占式无锁rte_ring为例):
单生产者和单消费者模式不受多生产者和多消费者模式的影响。当调度策略为SCHED_OTHER时,性能会受到影响。在多生产者多消费者模式下,当调度策略为SCHED_FIFO/SCHED_RR时,就会出现死锁。锁的具体实现过程如下:
标签:
用户评论
哇,正好需要这样的文章!DPDK基础知识对我来说有点陌生,这篇博文真是及时雨啊。
有8位网友表示赞同!
高级网络编程之路听起来好酷,希望这篇博文能让我少走弯路。
有16位网友表示赞同!
看了标题,我马上就想点进来看了。DPDK是啥?高级编程又是啥?有点期待呢。
有6位网友表示赞同!
DPDK基础知识了解不多,但高级网络编程一直是我梦寐以求的技能,这篇博文必须收藏!
有8位网友表示赞同!
我对DPDK的理解很浅,希望这篇博文能让我深入理解它的原理和应用。
有5位网友表示赞同!
文章标题很有吸引力,但我担心自己基础太差,能跟上进度吗?
有9位网友表示赞同!
高级网络编程一直是我的目标,这篇博文如果能帮我打好基础,那就太好了。
有9位网友表示赞同!
DPDK听起来很高级,但我对基础知识一窍不通,这篇博文对我来说是不是太深了?
有14位网友表示赞同!
看了标题,我马上想到了之前遇到的一些网络编程问题,希望这篇博文能给我一些解决思路。
有6位网友表示赞同!
我对DPDK有些兴趣,但高级网络编程对我来说有点遥不可及,这篇博文能否让我有所突破呢?
有16位网友表示赞同!
基础知识是学好高级技能的关键,这篇博文正好满足了我想提升自己的需求。
有14位网友表示赞同!
DPDK和高级网络编程都是热门话题,这篇博文能让我紧跟行业趋势。
有14位网友表示赞同!
希望这篇博文能够深入浅出,让我这个编程小白也能理解DPDK的精髓。
有19位网友表示赞同!
看了标题,我对DPDK有了新的认识,但高级网络编程还是一头雾水,希望文章能给出更多实例。
有14位网友表示赞同!
这篇博文标题太吸引人了,我迫不及待想看看DPDK的基础知识如何助我走上高级编程之路。
有11位网友表示赞同!
虽然我对DPDK不太了解,但高级网络编程我一直很感兴趣,这篇博文对我来说是个很好的起点。
有18位网友表示赞同!
基础不牢地动山摇,这篇博文让我意识到DPDK基础知识的重要性。
有16位网友表示赞同!
高级网络编程听起来很厉害,但我不确定自己是否适合学习,这篇博文能否给我一些信心呢?
有19位网友表示赞同!
DPDK基础知识对我来说是个挑战,但我觉得这篇博文能让我一步步克服困难。
有17位网友表示赞同!
希望这篇博文能让我对DPDK有更深入的了解,为我的高级网络编程之路打下坚实基础。
有5位网友表示赞同!