前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >learning:vet/policer

learning:vet/policer

作者头像
dpdk-vpp源码解读
发布2023-03-07 17:30:13
8400
发布2023-03-07 17:30:13
举报
文章被收录于专栏:DPDK VPP源码分析DPDK VPP源码分析

vpp自带的qos policer模块提供了限速及remark dscp功能。最开始policer需要和classify模块一起使用才能生效。在最近master分支合入了基于接口入方向配置policer功能,并且支持policer资源与绑定worker线程,利用handoff功能而避免多核模式下policer资源加锁(handoff 实现和加锁方式对性能影响没有详细数据)。

简介

流量限速也是QoS中的一个重要的概念。对于一台路由器而言,流量限速,是指限制进/出这台路由器的数据流的速率。 流量限速有两种技术: 1、CAR(Committed Access Rate) 2、流量整形(Generic Traffic Shaping)。 CAR (Committed Access Rate):约定访问速率,使用的算法如下: 令牌桶算法(Token Bucket Algorithm)

漏桶算法(Leaky Bucket Algorithm)

GTS和CAR一样,都使用了令牌桶算法,区别就是增加了一个缓存机制。

目前业界在Car一般都使用令牌桶算法。实现模式令牌桶可以看作是一个存放一定数量令牌的容器。系统按设定的速度向桶中放置令牌。当桶中令牌满时,多出的令牌溢出,桶中令牌不再增加。在使用令牌桶对流量规格进行评估时,是以令牌桶中的令牌数量是否足够满足报文的转发为依据的。每个需要被转发的报文,都要从令牌桶中领取一定数量的令牌(具体数量视报文大小而定),才可以被正常转发。如果桶中存在足够的令牌可以用来转发报文,称流量遵守或符合约定值,否则称为不符合或超标。按照系统向令牌桶投放令牌的速率和令牌桶的数量划分,令牌桶算法有三种模式:单速单桶、单速双桶、双速双桶。 在单速双桶和双速双桶中,令牌的使用IEEE又定义了3种颜色(分别为红色、黄色和绿色)以及两种模式:色盲(color-blind)模式和色敏(color-aware)模式,缺省为色盲模式。

这里推荐阅读一下下面的2篇文章,本文就不详细介绍了: 1、CIR,CBS,EBS,PIR,PBS傻傻分不清楚?看这里!----揭秘令牌桶 https://forum.huawei.com/enterprise/zh/thread-279033.html 2、QoS基础及技术原理-2 https://blog.csdn.net/kaoa000/article/details/78477774

Policer基本结构体

policer相关代码在src\vnet\policer\policer.c,具体的配置相关结构体如下图所示,代码逻辑不是特别难。策略分配类型字段还未完全理解,待后续补充。

在阅读最新代码时,和旧版本变化很大。

1、policer_t 设置cache line对齐。以避免cache一致性问题带来的性能损耗。

代码语言:javascript
复制
pool_get_aligned (pm->policers, policer, CLIB_CACHE_LINE_BYTES);

2、增加了基于policer的三种动作的统计功能。

代码语言:javascript
复制
vlib_combined_counter_main_t policer_counters[] = {
  {
    .name = "Policer-Conform",
    .stat_segment_name = "/net/policer/conform",
  },
  {
    .name = "Policer-Exceed",
    .stat_segment_name = "/net/policer/exceed",
  },
  {
    .name = "Policer-Violate",
    .stat_segment_name = "/net/policer/violate",
  },
};

3、增加支持接口入方向policer动作,及默认开启handoff功能,解决多核场景下,避免policer资源增加互斥锁。

疑问:classify-policer中未看到使用互斥锁,是否存在问题?待后续classify-policer学习时在详细分析。 上图原件放在了github上,可以自行查看。https://github.com/jin13417/dpdk-vpp-learning/tree/main/new_map

命令行

1、添加。删除policer
代码语言:javascript
复制
 #policer 配置有2个cli
 configure policer <del> name <policer_name> <params>
 policer name <name> <params> 

Params:支持说明: 1、#限速类型基于速率还是报文数量 2、cireircbeb#限速大小设置 3、color-aware #默认是色盲模式,配置是色敏模式。 4、round计算速率时四舍五入类型 5、type <1r2c|1r3c|2r3c-2698|2r3c-4115|2r3c-mef5cf1> #描述策略的分类类型 6、[conform-action | exceed-action | violate-action] [drop | transmit | mark-and-transmit [dscp]] 支持配置三种动作类型,conform、exceed、violate。

policer基本配置参数说明如下:

1、下面配置policy名称jsh,使用单桶单速 800Kbps,动作限速切remark dscp=38,超过直接丢弃。

代码语言:javascript
复制
代码语言:javascript
复制
configure policer name jsh cir 800 cb 90000 rate kbps round closest type 1r2c conform-action mark-and-transmit AF43 exceed-action drop

关于cir cbs配置关系还是需要注意的。   在令牌桶算法中,CIR的值越大,即令牌产生的速率越大,报文可以获取的令牌就越多,流向网络的流量也就越大。因此,CIR的值是控制流入网络中流量多少的关键。CBS也是一个重要参数。CBS的值越大,C桶中可以积累令牌的数目也越多,允许通过的报文尺寸就越大。   由于设备进行的是逐包转发,CBS的值不应该小于当前网络上允许传输的报文的最大长度。原则上,令牌桶容量CBS需要大于等于网络中可能出现的最大报文的长度和业务流量的正常突发量(否则会导致限速不准)。对于华为的以太网交换机,我们有总结的经验性公式:

代码语言:javascript
复制
1、带宽 ≤ 100Mbit/s时,令牌桶容量CBS(Bytes) = 带宽(kbit/s) * 1000(s)/8
2、带宽 > 100Mbit/s时,令牌桶容量CBS(Bytes) = 100000(kbit/s) * 1000 (s)/8

这里需要说明一下,速率G M K 直接换算是按照1000为单位。pps转换为kbps,默认报文长度是按照256字节来计算的。

代码语言:javascript
复制
/* Misc Policer specific definitions */
#define QOS_POLICER_FIXED_PKT_SIZE 256
qos_convert_pps_to_kbps (u32 rate_pps)
{
  u64 numer, rnd_value = 0;
  numer = (u64) ((u64) rate_pps * (u64) QOS_POLICER_FIXED_PKT_SIZE * 8LL);
  (void) qos_pol_round (numer, 1000LL, &rnd_value, QOS_ROUND_TO_CLOSEST);
  return ((u32) rnd_value);
}
2、查询policer资源配置
代码语言:javascript
复制
 learning_vpp1# show policer name jsh
Name "jsh" type 1r2c cir 800 eir 0 cb 90000 eb 0
rate type kbps, round type closest
conform action mark-and-transmit AF43, exceed action drop, violate action drop

Template policer at 7fffba29b600: single rate, not color-aware
cir 201125 tok/period, pir 1 tok/period, scale 15
cur lim 2949120000, cur bkt 2949120000, ext lim 0, ext bkt 0
last update 0
#policer统计计数信息--新增加的
conform 0 packets, 0 bytes
exceed 0 packets, 0 bytes
violate 0 packets, 0 bytes
-----------

注意命令行提示是show policer [name],但是输入时需要show policer name [name] 也尝试自己修改了一下,尝试提交到vpp master分支后,执行检查各种报错。

3、查询pool资源情况

查询当前pool资源使用情况:

代码语言:javascript
复制
learning_vpp1# show policer pools 
pool sizes: configs=1 templates=1 policers=1

需要注意configs、和templates数量必须一致。

4、policer input接口限速

这个功能应该是今年新增加的支持接口入方向限速,并增加handoff功能。

代码语言:javascript
复制
policer input [unapply] name <name> <interfac>

#接口使能policer
policer input name jsh GigabitEthernet13/0/0
#查询使能情况
learning_vpp1# show interface feat GigabitEthernet13/0/0 
Feature paths configured on GigabitEthernet13/0/0...
device-input:  #使能在device-input接点
  policer-input  

cli policer-input node 使能未做重复使能处理,存在节点重复使能问题。

5、policer bind worker线程
代码语言:javascript
复制
#新增命令行
policer bind [unbind] name <name> <worker>
#查询当前环境worker线程数量
  learning_vpp1# show thread
ID     Name                Type        LWP     Sched Policy (Priority)  lcore  Core   Socket State     
0      vpp_main                        18371   other (0)                0      0      0      
1      vpp_wk_0            workers     18376   other (0)                1      1      0      
2      vpp_wk_1            workers     18377   other (0)                2      2      0   
#设置policer jsh绑定worker线程1--<vpp_wk_1>
learning_vpp1# policer bind name jsh 1

trace流程

基本配置如下,在vpp1配置policer jsh并绑定在接口GigabitEthernet13/0/0,在vpp2接口发起ping vpp1接口ip地址,在vpp1上抓包。

代码语言:javascript
复制
#1、配置及组网如下:
            vpp1        <----------->   vpp2
GigabitEthernet13/0/0 (up):  |   GigabitEthernet13/0/0 (up):
  L3 192.168.100.1/24                 L3 192.168.100.2/24

#2、vpp1上配置policer
configure policer name jsh cir 800 cb 90000 rate kbps round closest type 1r2c conform-action mark-and-transmit AF43 exceed-action drop
#3、接口使能policer。
policer input name jsh GigabitEthernet13/0/0

1、默认不开启policer绑定worker核 trace显示报文从worker1上接收,node流程dpdk-input->policer-input(policer 处理)->ethernet-input(基本流程)

代码语言:javascript
复制
------------------- Start of thread 2 vpp_wk_1 -------------
Packet 1
01:54:06:401559: dpdk-input
  GigabitEthernet13/0/0 rx queue 0
  buffer 0x9b492: current data 0, length 110, buffer-pool 0, ref-count 1, totlen-nifb 0, trace handle 0x2000000
                  ext-hdr-valid 
                  l4-cksum-computed l4-cksum-correct 
  PKT MBUF: port 1, nb_segs 1, pkt_len 110
    buf_len 2176, data_len 110, ol_flags 0x80, data_off 128, phys_addr 0x78ad2500
    packet_type 0x91 l2_len 0 l3_len 0 outer_l2_len 0 outer_l3_len 0
    rss 0x0 fdir.hi 0x0 fdir.lo 0x0
    Packet Offload Flags
      PKT_RX_IP_CKSUM_GOOD (0x0080) IP cksum of RX pkt. is valid
    Packet Types
      RTE_PTYPE_L2_ETHER (0x0001) Ethernet packet
      RTE_PTYPE_L3_IPV4_EXT_UNKNOWN (0x0090) IPv4 packet with or without extension headers
  IP4: 00:0c:29:17:0a:44 -> 00:0c:29:63:94:30
  ICMP: 192.168.100.2 -> 192.168.100.1
    tos 0x00, ttl 254, length 96, checksum 0x7348 dscp CS0 ecn NON_ECN
    fragment id 0x0000
  ICMP echo_request checksum 0xb7c9 id 38722
01:54:06:401636: policer-input #policer限速使能
  VNET_POLICER: sw_if_index 2 policer_index 0 next 2
01:54:06:401693: ethernet-input
  IP4: 00:0c:29:17:0a:44 -> 00:0c:29:63:94:30
01:54:06:401730: ip4-input
  ICMP: 192.168.100.2 -> 192.168.100.1
........

2、开启policer绑定worker0核,trace抓包 报文从worker1上收取,在policer input节点判断policer资源中thread_index不是当前线程,通过handoff功能送到指定线程进行处理。

代码语言:javascript
复制
#1、policer绑定核1.
learning_vpp1# policer bind name jsh 0
#2、从worker1上收取报文,通过handoff送到worker0核上去做限速处理。
------------------- Start of thread 2 vpp_wk_1 -------------
Packet 1

01:59:53:887311: dpdk-input
  GigabitEthernet13/0/0 rx queue 0
  buffer 0x9b30c: current data 0, length 110, buffer-pool 0, ref-count 1, totlen-nifb 0, trace handle 0x2000000
                  ext-hdr-valid 
                  l4-cksum-computed l4-cksum-correct 
  PKT MBUF: port 1, nb_segs 1, pkt_len 110
    buf_len 2176, data_len 110, ol_flags 0x80, data_off 128, phys_addr 0x78acc380
    packet_type 0x91 l2_len 0 l3_len 0 outer_l2_len 0 outer_l3_len 0
    rss 0x0 fdir.hi 0x0 fdir.lo 0x0
    Packet Offload Flags
      PKT_RX_IP_CKSUM_GOOD (0x0080) IP cksum of RX pkt. is valid
    Packet Types
      RTE_PTYPE_L2_ETHER (0x0001) Ethernet packet
      RTE_PTYPE_L3_IPV4_EXT_UNKNOWN (0x0090) IPv4 packet with or without extension headers
  IP4: 00:0c:29:17:0a:44 -> 00:0c:29:63:94:30
  ICMP: 192.168.100.2 -> 192.168.100.1
    tos 0x00, ttl 254, length 96, checksum 0x7348 dscp CS0 ecn NON_ECN
    fragment id 0x0000
  ICMP echo_request checksum 0x7e33 id 48068
01:59:53:887634: policer-input
  VNET_POLICER: sw_if_index 2 policer_index 0 next 1
01:59:53:887728: policer-input-handoff  #1、handoff功能
  policer 0, handoff thread 2 to 1
##2、worker0上抓取报文。报文又送到policer-input处理。
------------------- Start of thread 1 vpp_wk_0 -------------------
Packet 1
01:59:53:887828: handoff_trace
  HANDED-OFF: from thread 2 trace index 0
01:59:53:887828: policer-input
  VNET_POLICER: sw_if_index 2 policer_index 0 next 2
01:59:53:887879: ethernet-input
  IP4: 00:0c:29:17:0a:44 -> 00:0c:29:63:94:30
01:59:53:887942: ip4-input
  ICMP: 192.168.100.2 -> 192.168.100.1
    tos 0x98, ttl 254, length 96, checksum 0x72b0 dscp AF43 ecn NON_ECN
    fragment id 0x0000
.....

3、查询报文统计

代码语言:javascript
复制
learning_vpp1# show policer name jsh
Name "jsh" type 1r2c cir 800 eir 0 cb 90000 eb 0
rate type kbps, round type closest
conform action mark-and-transmit AF43, exceed action drop, violate action drop

Template policer at 7fffbb358b40: single rate, not color-aware
cir 202937 tok/period, pir 1 tok/period, scale 15
cur lim 2949120000, cur bkt 2949120000, ext lim 0, ext bkt 0
last update 0
conform 30 packets, 3250 bytes ##统计计数
exceed 0 packets, 0 bytes
violate 0 packets, 0 bytes
-----------

总结

本文主要介绍了policer模块基本数据结构及相关命令行配置,并通过ping报文方式介绍policer input node处理及handoff功能使用。classify-policer后续有时间再阅读。

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-30,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 DPDK VPP源码分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • Policer基本结构体
  • 命令行
    • 1、添加。删除policer
      • 2、查询policer资源配置
        • 3、查询pool资源情况
          • 4、policer input接口限速
            • 5、policer bind worker线程
            • trace流程
            • 总结
            相关产品与服务
            云硬盘
            云硬盘(Cloud Block Storage,CBS)为您提供用于 CVM 的持久性数据块级存储服务。云硬盘中的数据自动地在可用区内以多副本冗余方式存储,避免数据的单点故障风险,提供高达99.9999999%的数据可靠性。同时提供多种类型及规格,满足稳定低延迟的存储性能要求。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
            http://www.vxiaotou.com