轮询模式驱动程序(Poll Mode Driver,PMD)线程负责处理DPDK数据路径上的大部分工作,并执行诸如输入端口的连续轮询等任务。一旦接收到数据包及对其进行分类,分类完成后进行处理动作。

PMD线程使用接收(RX)和发送(TX)队列,通常称为rxqs和txqs。TX队列的配置自动产生,RX队列可以由用户进行配置。这可以通过以下两种方式之一实现:

  • 对于物理接口,配置通过工具ovs-appctl 实现.

  • 对于虚拟接口,配置也是通过工具 ovs-appctl 实现,但是此配置必须反映在客户机的配置中(例如,QEMU的命令行参数)。

ovs-appctl 工具也提供一些命令查询PMD线程以及相关队列信息,以下讨论这些。

PMD线程统计

显示当前统计信息:

$ ovs-appctl dpif-netdev/pmd-stats-show

清除统计信息:

$ ovs-appctl dpif-netdev/pmd-stats-clear

分配到PMD线程的端口/RX队列

PMD线程及其使用的RX队列需要正确配置,以便达到最大的性能。这一点尤其正确对于启用诸如multipqueue之类的功能的物理接口dpdk phy multipqueue和vhost用户接口dpdk vhost user。

显示端口/RX队列分配情况:

$ ovs-appctl dpif-netdev/pmd-rxq-show

RX队列可能手动固定在某个核心上。这将改变默认的到PMD线程的RX队列分配:

$ ovs-vsctl set Interface <iface> \other_config:pmd-rxq-affinity=<rxq-affinity-list>

where:

  • <rxq-affinity-list> 表示CSV格式列表:<queue-id>:<core-id>

例如:

$ ovs-vsctl set interface dpdk-p0 options:n_rxq=4 \other_config:pmd-rxq-affinity="0:3,1:7,3:8"

以上命令设置 4 个RX队列,配置如下:

  • 队列 #0 固定在核心3
  • 队列 #1 固定在核心7
  • 队列 #2 未固定
  • 队列 #3 固定在核心8

RX队列被固定的核心上运行的PMD线程将处于隔离状态。这意味着该线程只能轮询被固定的RX队列。

警告:

如果不存在未隔离的PMD线程,未固定的RX队列将得不到轮询。同样,如果参数中要求固定的核心<core-id>不可用(例如,<core-id>不在pmd-cpu-mask掩码内),相应的RX队列也不会被任何PMD线程的轮询。

如果没有未RX队列指定pmd-rxq-affinity参数, 它们将自动的分配到PMDs线程(核心)。

为PMDs线程自动分配RXQs的算法可由以下命令设置:

$ ovs-vsctl set Open_vSwitch . other_config:pmd-rxq-assign=<assignment>

默认情况下,使用cycles分配法,即首先将每个RXQs队列按照测量的处理周期排序,之后以降序方式公平的分配到PMDs线程,如果PMD线程数量小于队列数量,分配过程将以多轮次完成(由上到下,再由下到上). 例如,5个接收队列和3个核心 - 3,7和8. 最近一个时间间隔在每个队列上测量到的核心周期使用情况如下:

  • 队列 #0: 30%
  • 队列 #1: 80%
  • 队列 #3: 60%
  • 队列 #4: 70%
  • 队列 #5: 10%

RX接收队列将以如下的次序分配到核心上:

  • Core 3: Q1 (80%) |
  • Core 7: Q4 (70%) | Q5 (10%)
  • Core 8: Q3 (60%) | Q0 (30%)

另外, 也可以使用roundrobin分配法,即以循环方式将RXQs队列分配到PMDs进程. 在OVS 2.9版本前,这是默认使用的分配算法. 例如, 有以下的端口和队列:

  • 端口 #0 队列 #0 (P0Q0)
  • 端口 #0 队列 #1 (P0Q1)
  • 端口 #1 队列 #0 (P1Q0)
  • 端口 #1 队列 #1 (P1Q1)
  • 端口 #1 队列 #2 (P1Q2)

RX队列可能以如下的次序分配到核心上:

Core 3: P0Q0 | P1Q1
Core 7: P0Q1 | P1Q2
Core 8: P1Q0 |

查看关于每个RX队列占用的PMD核心周期数,在当下测量出来的占用历史信息:

$ ovs-appctl dpif-netdev/pmd-rxq-show

注意:

为每个RX队列记录和显示一分钟的历史记录,以允许流量模式高峰。由于流量模式或重新配置,所引起的RX队列的PMD核心周期的任何更改,需要一分钟才能完全反映在统计数据中。

每当配置发生更改,或者通过以下命令的执行,都将触发RX队列到PMD线程的分配变动:

$ ovs-appctl dpif-netdev/pmd-rxq-rebalance

pmd-rxq-show命令于OVS 2.6.0版本加入。

基于利用率的RX队列到PMD的分配和pmd-rxq-rebalance命令添加于OVS 2.9.0。在此之前,分配采用循环方法,没有考虑处理周期。

此外,pmd-rxq-show命令的输出被修改为包括以百分比表示的PMD的RX队列利用率。在此之前,跟踪统计数据是不可行的。

自动分配到PMD线程的端口/RX队列 (实验性质)

基于周期或利用率的RX队列分配到PMD线程可以提高负荷分布效率,但不适应随时间变化的流量模式。这会导致PMD之间的负载不均匀,从而导致总体吞吐量的降低。

为解决此问题,可启用PMD自动负载均衡:

$ ovs-vsctl set open_vswitch . other_config:pmd-auto-lb="true"

如果pmd-auto-lb设置为true,并且启用了基于周期的分配方法,如果存在2个或多个非隔离的PMD线程,其中至少一个PMD正在轮询多个RX队列,自动负载均衡将启用。所以,需要满足以下条件才能启用自动负载均衡:

  1. RX队列到PMD的基于周期的分配已启用.
  2. pmd-auto-lb参数设置为true.
  3. 存在两个或多个非隔离PMD线程.
  4. 并且至少一个非隔离的PMD线程具有多个轮询队列.

如果不满足上述任一条件,则禁用PMD自动负载均衡。

一旦设置了自动负载均衡,每个非隔离PMD都会每10秒钟测量一次其每个关联队列的处理负荷。如果PMD连续6个间隔的合并负荷达到95%,PMD认为自己已经过载。

如果任一PMD进程过载,OVS主线程执行PMD分配算法的预检运行。预检运行不会更改现有队列的PMD分配。

如果预检运行的结果表明负荷分布的提升,将执行实际重新分配。

注意:

如果队列在不同NUMA节点分配,则PMD自动负载均衡当前不起作用,因为与预检的预测相比实际处理负荷可能会变得更糟。

两个连续的PMD自动负载均衡操作之间的最短时间可可通过以下方式配置:

$ ovs-vsctl set open_vswitch .\other_config:pmd-auto-lb-rebal-interval="<interval>"

参数<interval> 的单位为分钟. 默认间隔为1分钟,设置为0意味值恢复1分钟的默认值。

用户可以使用此选项避免频繁触发PMD自动负载均衡。例如,设置此值(以分钟为单位),使其在几小时,一周或一天内发生一次。

注意:
在某些场景下,可能不希望自动负载均衡触发。例如,如果特定RX队列的流量模式频繁的变化,并且由于dpctl和EMC中对新添加流的更改,将打乱处理器缓存。在这种情况下,用户应该相应地配置重新均衡间隔避免频繁的再均衡发生。

OVS PMD 线程相关推荐

  1. OVS vswitchd启动(三十六)

    ovs-vswitchd.c的main函数最终会进入一个while循环,在这个无限循环中,里面最重要的两个函数是bridge_run()和netdev_run(). bridge_init(remot ...

  2. OVS DPDK--报文处理流程(八)

    OVS启动 vswitchd/ovs-vswitchd.c启动main–>netdev_run–>netdev_initialize–>netdev_dpdk_register–&g ...

  3. OVS DPDK--物理端口配置(三)

    netdev数据路径允许关联DPDK支持的物理端口,以便为主机提供高性能的入口/出口流量. 一.快速示例 此示例演示如何绑定两个dpdk端口到一个已有的网桥br0上,绑定的物理端口由硬件ID标识,分别 ...

  4. OVS+DPDK Datapath 包分类技术

    本文主体内容译于[DPDK社区文档],但并没有逐字翻译,在原文的基础上进行了一些调整,增加了对TSS分类器的详细阐述. 1. 概览 本文描述了OVS+DPDK中的包分类器(datapath class ...

  5. ovs datapath

    ovs有两种datapath(其实有且也只有这两个datapath) 一种是位于kernel的datapath,报文的收发都在内核态进行; 另一种是位于userspace的datapath,支持两种类 ...

  6. python使用Thread的setDaemon启动后台线程

    多线程编程当中, 线程的存在形态比较抽象. 通过前台线程\后台线程, 可以有效理解线程运行顺序.(复杂的多线程程序可以通过设置线程优先级实现) 后台线程与前台线程的直接区别是, 1)setDaemon ...

  7. python 多线程 setdaemon_python使用Thread的setDaemon启动后台线程教程

    多线程编程当中, 线程的存在形态比较抽象. 通过前台线程后台线程, 可以有效理解线程运行顺序.(复杂的多线程程序可以通过设置线程优先级实现) 后台线程与前台线程的直接区别是, 1)setDaemon( ...

  8. DPDK — 数据平台优化技术

    目录 文章目录 目录 DPDK 优化技术 DPDK 性能影响因素 硬件结构的影响 OS 版本及其内核的影响 OVS 性能问题 内存管理 CPU 核间无锁通信 设置正确的目标 CPU 类型与模式 优化方 ...

  9. 异数OS 2017 DPDK 峰会观后感

    1.DPDK in Container 使用虚拟网卡设备技术为每一个容器分配一个IP 网卡适配器(queue).容器技术可以解决虚拟机技术中虚拟机过于臃肿,难于热迁移的问题,可能可以代替美团OVS方案 ...

最新文章

  1. day07-字符编码、文件操作
  2. 拼多多面试:如何用 Redis 统计独立用户访问量?
  3. .Net 初步学习笔记之一——.Net 平台与.Net FrameWork框架的关系
  4. R_Studio(学生成绩)使用主成分分析实现属性规约
  5. 变速积分pid控制器matlab,变速积分PID控制系统设计.docx
  6. [Abp vNext微服务实践] - 搭建租户管理服务
  7. 二叉搜索时与双向链表python_【剑指offer】26 二叉搜索树与双向链表
  8. 控件进阶 编辑学生的窗体
  9. 天池又上工业视觉检测算法大赛:瓶装白酒疵品质检
  10. Tutorial of Codeforces Round 729 (Div.2)
  11. Python练习题(四)
  12. APP开发之APP研发流程微信棋牌程序制作
  13. 五、结构化分析与设计
  14. mac版eclipse连接mysql_将Eclipse连接到mysql mac os x jdbc驱动程序
  15. 第二类曲面积分转化为二重积分
  16. 外星人入侵小游戏十二章十三章实现
  17. Python中的打包与解包
  18. 微信更新,干掉手机输入法!
  19. RabbitMQ实战运用(三)——安装与配置
  20. 学猫叫歌词计算机,学猫叫歌词 小峰峰(陈峰)、小潘潘(潘柚彤)_晴格歌词网

热门文章

  1. 求10000以内的所有完全数
  2. 抓娃娃机爪不动怎么办_抓娃娃机常见故障,娃娃机天车故障处理
  3. 第四周项目5——猴子选大王
  4. 将外部exe嵌入到界面中(Windows)——Qt
  5. Kotlin okhttp3 HttpClient
  6. 数据分析——文本文件
  7. 血型遗传检测(pair原来没有先后顺序)----去哪儿2016研发工程师编程题
  8. ARM的六大类指令集---LDR、LDRB、LDRH、LDM、STR、STRB、STRH、STM
  9. 安装黑苹果提示未能安装_(转)安装黑苹果 MAC OS X Lion 10.7.2过程 (未验证)
  10. 影评《一次别离》:丈夫这种…