DPDK的Port初始化的时候已经把整个树建立起来了,并没有靠配置来动态增加和删除,而且从初始化的整个过程来看,为了后续入队和出队流程的流水线的处理以及cache的处理来加快性能,整个树是被压扁了的。

我们先来看看,官网上对于整个数据的组织图示:

A schematic of the internal data structures in shown in with details in.

Internal Data Structures per Port

   

#

Data structure

Size (bytes)

# per port

Access type

Description

Enq

Deq

 

 

1

Subport table entry

64

# subports per port

 

Rd, Wr

Persistent subport data (credits, etc).

2

Pipe table entry

64

# pipes per port

 

Rd, Wr

Persistent data for pipe, its TCs and its queues (credits, etc) that is updated during run-time.

The pipe configuration parameters do not change during run-time. The same pipe configuration parameters are shared by multiple pipes, therefore they are not part of pipe table entry.

3

Queue table entry

4

#queues per port

Rd, Wr

Rd, Wr

Persistent queue data (read and write pointers). The queue size is the same per TC for all queues, allowing the queue base address to be computed using a fast formula, so these two parameters are not part of queue table entry.

The queue table entries for any given pipe are stored in the same cache line.

4

Queue storage area

Config (default: 64 x8)

# queues per port

Wr

Rd

Array of elements per queue; each element is 8 byte in size (mbuf pointer).

5

Active queues bitmap

1 bit per queue

1

Wr (Set)

Rd, Wr (Clear)

The bitmap maintains one status bit per queue: queue not active (queue is empty) or queue active (queue is not empty).

Queue bit is set by the scheduler enqueue and cleared by the scheduler dequeue when queue becomes empty.

Bitmap scan operation returns the next non-empty pipe and its status (16-bit mask of active queue in the pipe).

6

Grinder

~128

Config (default: 8)

 

Rd, Wr

Short list of active pipes currently under processing. The grinder contains temporary data during pipe processing.

Once the current pipe exhausts packets or credits, it is replaced with another active pipe from the bitmap.

大概说明了下数据的组织和入队、出队对数据结构访问的方式,下面我们具体说明。

  1. Port的初始化

  • 根据Port的初始化参数结构体或者配置文件,计算Port的需要的所有的内存

mem_size = sizeof(struct rte_sched_port) + x * sizeof(subport) + y * sizeof(pipe)

+ z * sizeof(queue_array) + a * sizeof(queue) + b * sizeof(profile) + bitmap;

所以subport越多,pipe越多,内存的需求增加的是很大的,这个需要根据实际的环境和需求配置。

  • 初始化各种参数,特别需要注意的令牌桶相关的初始化,初始化的思想可以参见3.1的实现。
  • Queue base calculation 根据每个队列的大小,计算队列queue_add[]的大小。
  • 根据subport --> pipe --> TC[0 .. 3] --> queue[0[0 ..63] ..3]的层次关系,给Port里面的

Subport、pipe、queue、pipe_profiles、bmp_array、queue_array赋值。

  • 初始化profiles,主要是port令牌桶相关的一些初始化,并以Port的基准计算pipe下的TC的令牌桶参数,还根据传入的队列的weight[0 .. 15]的比例,根据最小公倍数计算每个队列的cost,为TC下面的QUEUE的WRR调度做准备。
  • 初始化位图,位图为了使用cache line并优化查找,实现成了2级层次化,使用两个数组(array1和array2)对位图进行分层组织,array1 cache line对齐,array2 64位对齐,当array2位中有1位设置的时候,关联的array1中的位被置位,都在被清除。

2、Subport的初始化

主要是subport令牌桶和下面的4个TC的初始化,没什么说的。

3、Pipe的初始化

主要是Pipe的令牌桶和下面4个TC的初始化,没什么说的

初始化后整块内存的组织形式如下,以1个subport,2个Pipe为例,队列的大小为4:

DPDK QOS4 -- PORT数据结构的初始化相关推荐

  1. DPDK内存管理二:初始化

    DPDK 内存的初始化主要在rte_eal_init()函数中进行: eal_hugepage_info_init() /* 获取系统中hugepage种类以及数量信息到internal_config ...

  2. DPDK学习记录11 - 内存初始化4之rte_eal_hugepage_init

    1 rte_eal_hugepage_init rte_eal_hugepage_init有两种模式:legacy和dynamic,默认是后者.我运行dpdk app时没有指定模式,所以gdb跟代码到 ...

  3. HDFS源码分析心跳汇报之数据结构初始化

    在<HDFS源码分析心跳汇报之整体结构>一文中,我们详细了解了HDFS中关于心跳的整体结构,知道了BlockPoolManager.BPOfferService和BPServiceActo ...

  4. DPDK — RTE_LOG 日志模块

    目录 文章目录 目录 DPDK 的日志系统 RTE_LOG 宏 rte_log 和 rte_vlog 函数 日志模块初始化 第一阶段初始化 第二阶段初始化 注册新的日志类型 复用现有日志类型 参考文档 ...

  5. DPDK笔记 RSS(receive side scaling)网卡分流机制

    DPDK笔记 RSS(receive side scaling)网卡分流机制 RToax 2020年9月 DPDK 网卡RSS(receive side scaling)简介 DPDK-RSS负载均衡 ...

  6. Linux平台上DPDK入门指南

    目录 1. 简介 1.1. 文档地图 2. 系统要求 2.1. X86 上预先设置 BIOS 2.2. 编译DPDK 2.3. 运行DPDK应用程序 2.3.1. 系统软件 2.3.2. 在 Linu ...

  7. dpdk 多进程共享内存描述信息的机制

    dpdk 多进程共享内存描述信息的机制 在 dpdk legacy memory 模型浅析 这篇文章中,我描述了 linux 平台 dpdk 早期版本的内存模型并分析了此模型下对 hugepage 的 ...

  8. DPU网络开发SDK——DPDK(二)

    Hello world 上一次的文章中主要介绍了DPDK是什么,主要用在什么地方.作为一个SDK,DPDK提供了大量的function接口用于网络转发面程序的编写.接下来的几篇文章,我们会基于DPDK ...

  9. Nucleus SE RTOS初始化和启动

    Nucleus SE RTOS初始化和启动 Nucleus SE RTOS initialization and start-up 对于任何类型的操作系统,都有某种类型的启动机制.具体的工作方式因系统 ...

  10. OVS DPDK vhost-user详解(十二)

    在软件实现的网络I/O半虚拟化中,vhost-user在性能.灵活性和兼容性等方面达到了近乎完美的权衡.虽然它的提出已经过了四年多,也已经有了越来越多的新特性加入,但是万变不离其宗,那么今天就从整个v ...

最新文章

  1. python实现案例_基于Python实现相关分析案例
  2. 第七章 脚本参数的传递
  3. C++学习笔记1:virtual 继承
  4. 简明 python 教程 书_Python简明教程是不是这本书(简明python教程书本)
  5. 硬件设计规范化 - 原理图和 PCB 的版本号命名规则
  6. 电脑计算机c盘缓存清理,电脑C盘缓存文件怎么删除
  7. MagicDraw-IBD图
  8. CAD下载与安装(含安装包百度网盘链接)
  9. 《2015年中国公有云服务发展报告》跋
  10. 学习笔记:中国大学MOOC《计算机程序设计C++》第3周单元测试
  11. 关于ICP和EDI许可证,你了解多少?
  12. jQuery项目:京东商品详情页
  13. 如何用纯 CSS 创作一只愤怒小鸟中的绿猪
  14. 下载多张图片并压缩成压缩包
  15. 如何两个电脑共享文件实现多人编辑_excel怎么实现多人共同编辑一个文档
  16. 能自由转换格式的PDF软件
  17. 《学会提问-批判性思维指南》--70页原创PPT免费分享 (评论: 学会提问)
  18. 英文、数字和汉字、日文的字符判断 英文占1个字符,中文汉字占2个字符 el-form表单验证规则
  19. msp fet430uif驱动
  20. centOs7.6+Typecho+Bt面板搭建个人Blog

热门文章

  1. Java操作zip压缩和解压缩文件工具类
  2. vmware workstation 不可恢复错误 vcpu-0
  3. java8 jstack_java自带命令行工具(jcmd,jstack)
  4. redis3.2版本protected-mode参数
  5. 2017.11.21 MS Power BI training
  6. 解决CAD图层打印不出来的方法
  7. Unity加载模块深度解析(网格篇)
  8. 数组指针和指针数组的区别(转)
  9. tomcat监听activemq jms配置
  10. Python实战(3)指定的文本列求和求平均