四种工作模式
- 单线程(单线程做所有的事情,管理、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下可以做接口的布局工作。