一、METER的目的
Meter可用于QOS以及差异化服务,其QOS可以防止有人恶意占用带宽,在保证用户正常业务前提下,保证整个网络不发生拥塞,提升整个网络的服务质量;同时可以针对不用用户需求、成本预算等考虑 ,向用户提供差异化服务。
二、METER原理
METER限速是对流经设备接口的报文速度做限制,使流量超出指定阀值的那部分直接被丢弃,而低于阀值的部分则进入或离开设备。与之相似的是高速公路上的限速一样,如图1。
图1 限速标识
提到Meter表的实现,其最核心的思想就是令牌桶算法,如图2所示。
令牌桶(Token-Bucket)是目前最常采用的一种流量测量方法,用来评估流量速率是否超过了规定值。这里的令牌桶是指网络设备的内部存储池,而令牌则是指以给定速率填充令牌桶的虚拟信息包。
令牌桶可以看作是一个存放令牌的容器,预先设定一定的容量。
系统按设定的速度向桶中放置令牌,当桶中令牌满时,多余的令牌溢出。
常见的3类令牌桶:单速单桶、单速双桶(srTCM)、双速双桶(trTCM);这里不再展开介绍网上很多。
在网络处理中的应用是进入设备的每一个数据包想要被转发都需要得到一个令牌,而令牌来自于令牌桶。令牌桶以一个速度获得令牌,该速度就是限速的速度,超过令牌桶容量的令牌会溢出,同时数据包转发以一定的速度消耗令牌,这就是限速的原理。令牌桶的作用是面对大量数据请求时,限制其突发速度上限。
图3报文经过令牌桶的处理
三、软件下发表项中的重要参数
智能网卡会通过软件下发配一个转发的流表,当入端口进来的流量 ,会被meter表处理 ,超过限速部分的流量会标记动作(当前只支持丢弃),剩余未超出限速部分的流量会从出端口转出。以上就是智能网卡meter表的工作原理。软件下发的meter表中含有如下几项,meter_enable,meter_mode,meter_id,meter_rate,meter_brust_size;
meter_enable:会控制该条meter表项是否在硬件底层生效;
meter_mode:表示该条表项是pps限速,还是bps限速;
meter_id:表明 meter表内表项的编号,一张表中不可有重复的编号。memter_id的定义是从1开始的,最大值是智能网卡支持的最大表项规格而定(考虑需求以及硬件资源等)。
meter_rate:表示作用于数据报文的限速值,当meter_mode=pps,则单位是packet/s,当meter_mode=bps,则单位是bit/s
meter_brust_size:用于在使用meter表时突发的大量数据包或者字节时,设置每一个表项对应的令牌通桶深度;当摸个是某个大流量到来的瞬间限速的速度等于令牌桶的容量+限速的速度。
四、硬件实现
目前的实现是基于单速单桶,流程如下:
- 进入智能网卡的报文经过分流规则以及查精确表命中后,会根据meter_id去查meter限速表进行索引,会发起读表请求,查出meter_rate限速值,meter_mode限速模式、meter_brust_size突发门限值,同时也会记录此时当前令牌桶令牌数量(硬件会固定时钟周期计算新增加的令牌数量,然后向令牌桶里发放令牌)。
- 2.首先比较当前报文长度是否大于突发门限值,如果大于突发门限值,就将报文丢弃。
- 3.如果小于突发门限值,接下来会比较报文长度是否超过剩余令牌数量,如果超过了,就将报文丢弃
- 4.如果小于令牌数量,报文通过,并更新剩余的令牌数量。