四种工作模式


  • 单线程(单线程做所有的事情,管理、IO和worker)。
  • 只有worker线程多线程(主线程做管理,worker多线程做IO和worker)。
  • IO和worker线程都是多线程(主线程做管理,IO多线程做IO,worker多线程做worker)。
  • mode 4, 不知道怎么翻译(主线程做管理和IO,worker多线程做worker)。

单线程

主线程做了包处理和其他的管理功能(CLI、API、统计)。这是默认设置,不需要特殊的启动配置。

只有worker多线程

主线程负责管理功能(CLI、API、统计),一个或者多个worker线程接收数据包,处理并发送。每一个worker线程都是从接口的输入队列轮询接收。
RSS使多个线程可以从同一个物理网口上接收数据。(NIC上的RSS功能把流量分给不同的队列)。

IO和Worker都是多线程

主线程负责管理功能(CLI、API、统计),一个或者多个IO线程接收数据包分给worker线程。每一个IO线程都是都是从接口的输入队列轮询接收。
通常这种情况不使用RSS。一个或者多个worker线程从IO线程接收数据包、处理并且发送。

Mode 4

和IO、worker多线程类似,区别在于主线程还需要处理输入函数。也就是main线程做管理功能和接收数据包,分派给worker多线程,处理并且发送。

注:以上所说的IO线程只做输入不做输出,可以理解为分派线程。

线程位置


在启动配置文件的cpu{...}部分。VPP平台可以将线程设置为手动或者自动。自动如下:

  • 设置了skip-cores X,则前X个核都不会用。
  • 设置了main-core x,则主线程运行在x核上,否则运行在第一个可以用的核上。
  • 设置了main-core-io,激活第四种模式。
  • 设置了io N,激活第三种模式,并且前N个可以用的核将运行IO线程。
  • 设置了worker N,激活第2、3或者4种模式,并且前N个可以用的核将运行worker线程。
  • 设置了corelist-workers A,B1-Bn,C1-Cn,激活第2、3或者4种模式,并且将指出的核运行worker线程。
  • 设置了corelist-io A,B1-Bn,C1-Cn,激活模式3,指定的核运行IO线程。

也可以运行命令查看show threads:

vpd# show threads
ID Name Type LWP lcore Core Socket State
0 vpe_main 59723 2 2 0 wait
1 vpe_wk_0 workers 59755 4 4 0 running
2 vpe_wk_1 workers 59756 5 5 0 running
3 vpe_wk_2 workers 59757 6 0 1 running
4 vpe_wk_3 workers 59758 7 1 1 running
5 vpe_io_0 io 59759 8 2 1 running
6 vpe_io_1 io 59760 9 3 1 running
7 stats 59775
vpd#

上面的例子显示主线程运行在核心2上,worker线程运行在4-7上,IO线程运行在8、9上。

配置示例


手动

将主线程放置在核1上,IO线程放在3和19上,worker线程放在4,5,20,21上。

cpu {
    main-core 1
    corelist-io 3,19
    corelist-workers 4-5,20-21
}

自动

主线程核1,worker线程核2,3,4。

cpu {
    skip-cores 1
    workers 3
}

内存申请


VPP平台可以感知NUMA,可以在不同的CPU上申请内存。配置文件的的dpdk{...}部分配置socket-mem A,B。

dpdk {
    socket-mem 1024,1024
}

以上配置从NUMA0和NUMA1分别申请了1G内存,每个工作线程都可以使用本地buffer。
内存从hugepages分配。如果1G大页可以使用,更倾向于使用1G大页。vpp负责hugepages文件系统的mount和umount,所以不用手动管理。

多线程设置的接口


启动时,VPP平台指定接口(或者开了RSS时的queue)到不同的worker线程,轮询接收数据包。
下面的示例显示和修改接口布局:

vpd# sh dpdk interface placement
Thread 1 (vpp_wk_0 at lcore 5):
TenGigabitEthernet2/0/0 queue 0
TenGigabitEthernet2/0/1 queue 0
Thread 2 (vpp_wk_1 at lcore 6):
TenGigabitEthernet2/0/0 queue 1
TenGigabitEthernet2/0/1 queue 1

下面的例子是TenGigabitEthernet2/0/0的队列1移动到第一个worker线程的操作。

vpd# set dpdk interface placement TenGigabitEthernet2/0/1 queue 1 thread 1
DBGvpd# sh dpdk interface placement
Thread 1 (vpp_wk_0 at lcore 5):
TenGigabitEthernet2/0/0 queue 0
TenGigabitEthernet2/0/1 queue 0
TenGigabitEthernet2/0/1 queue 1
Thread 2 (vpp_wk_1 at lcore 6):
TenGigabitEthernet2/0/0 queue 1

只有在模式2下可以做接口的布局工作。

最后修改:2021 年 08 月 18 日
如果觉得我的文章对你有用,请随意赞赏