DPDK的meter库(单速率三色算法)
DPDK提供了丰富的基础库,其中就有利用令牌桶来实现meter功能,可以参考例子中的qos_meter。这篇博客主要就是解读这个例子。令牌桶算法分为单速率三色算法和双速率单色算法,单速率只有一个速率桶C桶以及一个EBS。关注点在于报文的突发尺寸,双速率有两个速率桶C和P,更关注突发的报文速率。
首先来看单速率三色,令牌产生的速率是cir,C桶容量为cbs,当C桶满时,再去添加E桶,E桶也满时,令牌丢弃。
在取令牌时,先取C桶,C桶满足,不管E桶,E桶保持不变,C桶减少相应数量令牌返回绿色。
C桶不满,取E桶令牌,E桶满足,E桶减少相应数量令牌返回黄色。E桶也不够,两个桶的令牌数保持不变。返回红色。
main函数:一大堆初始化,主要看app_configure_flow_table这个函数。
static int
app_configure_flow_table(void)
{uint32_t i, j;int ret;for (i = 0, j = 0; i < APP_FLOWS_MAX;i ++, j = (j + 1) % RTE_DIM(PARAMS)) {ret = FUNC_CONFIG(&app_flows[i], &PARAMS[j]);if (ret)return ret;} return 0;
}
FUNC_CONFIG对应的函数为
int
rte_meter_srtcm_config(struct rte_meter_srtcm *m, struct rte_meter_srtcm_params *params)
{uint64_t hz;/* Check input parameters */if ((m == NULL) || (params == NULL)) {return -1;}if ((params->cir == 0) || ((params->cbs == 0) && (params->ebs == 0))) {return -2;}/* Initialize srTCM run-time structure */hz = rte_get_tsc_hz();m->time = rte_get_tsc_cycles();m->tc = m->cbs = params->cbs;m->te = m->ebs = params->ebs;rte_meter_get_tb_params(hz, params->cir, &m->cir_period, &m->cir_bytes_per_period);RTE_LOG(INFO, METER, "Low level srTCM config: \n""\tCIR period = %" PRIu64 ", CIR bytes per period = %" PRIu64 "\n",m->cir_period, m->cir_bytes_per_period);return 0;
}static void
rte_meter_get_tb_params(uint64_t hz, uint64_t rate, uint64_t *tb_period, uint64_t *tb_bytes_per_period)
{
/*先计算添加一个字节所需的cpu周期数*如果计算出的结果值太小,说明添加一个字节所需的cpu周期很短。*如果直接用计算结果,会导致精度不准,所以将更新表的周期数设置为RTE_METER_TB_PERIOD_MIN,每次 *添加的字节数大于1*/double period = ((double) hz) / ((double) rate); if (period >= RTE_METER_TB_PERIOD_MIN) {*tb_bytes_per_period = 1;*tb_period = (uint64_t) period;} else {*tb_bytes_per_period = (uint64_t) ceil(RTE_METER_TB_PERIOD_MIN / period);*tb_period = (hz * (*tb_bytes_per_period)) / rate;}
}app_flows[]的数据类型是struct rte_meter_srtcm
struct rte_meter_srtcm {uint64_t time; /* 最后一次更新C和E桶的时间*/uint64_t tc; /* C桶当前可用令牌数*/uint64_t te; /* E桶当前可用令牌数*/uint64_t cbs; /* cbs数值,C桶的总容量*/uint64_t ebs; /* ebs数值,E桶的总容量*/uint64_t cir_period; /* 每隔cir_period*cpu周期,更新C桶*/uint64_t cir_bytes_per_period; /*每次更新C桶所需添加的令牌数*/
};PARAMS:
struct rte_meter_srtcm_params app_srtcm_params[] = {{.cir = 1000000 * 46, .cbs = 2048, .ebs = 2048},
};#define FUNC_CONFIG rte_meter_srtcm_config
rte_meter_srtcm_config(struct rte_meter_srtcm *m, struct rte_meter_srtcm_params *params)
这个函数就是对app_flow[]进行赋值
关于cir,cbs,ebs,pbs,pir:
CIR(Committed Information Rate,承诺信息速率):每秒可通过的速率,计量单位为Kbps (以bit 位为单位)。
CBS(Committed Burst Size):承诺突发尺寸突发尺寸,令牌桶的容量,即每次突发所允许的最大的流量尺寸。设置的突发尺寸必须大于最大报文长度。计量单位为byte(字节)。
EBS(Excess Burst Size,超出突发尺寸):即瞬间能够通过的超出突发流量。计量单位为byte(字节)。
初始化完成之后,针对每个包,都会进行颜色判断,色盲模式的判断比较简单,对应的函数如下:
static inline enum rte_meter_color
rte_meter_srtcm_color_blind_check(struct rte_meter_srtcm *m,uint64_t time,uint32_t pkt_len)
{uint64_t time_diff, n_periods, tc, te;/* Bucket update */time_diff = time - m->time;n_periods = time_diff / m->cir_period;m->time += n_periods * m->cir_period;//m->time = time。。强行增加阅读难度,更新m->time/* 先往C桶添加令牌,C桶添加满之后再往E桶添加令牌 */tc = m->tc + n_periods * m->cir_bytes_per_period; //更新当前C桶可用令牌数te = m->te;if (tc > m->cbs) {te += (tc - m->cbs);if (te > m->ebs)te = m->ebs;tc = m->cbs;}/* Color logic */
//C桶可用令牌足够,返回绿色。if (tc >= pkt_len) {m->tc = tc - pkt_len;m->te = te;return e_RTE_METER_GREEN;}
//C桶不够,用E桶判断。if (te >= pkt_len) {m->tc = tc;m->te = te - pkt_len;return e_RTE_METER_YELLOW;}m->tc = tc;m->te = te;return e_RTE_METER_RED;
}
DPDK的meter库(单速率三色算法)相关推荐
- html 体温单源码,体温单 三色单
[实例简介] 根据护理记录数据绘出体温单,三色单,附带源码 [实例截图] [核心代码] 体温单控件源码 └── 体温单控件源码 ├── TemperatureChart.dll ├── 体温单源码+数 ...
- 垃圾收集器以及三色标记
分代收集理论 当前虚拟机的垃圾收集采用分代收集算法,只是根据对象存活周期的不同将内存分为几块. 一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法 新生代:每次 ...
- 数据库中间件 MyCAT源码分析:【单库单表】插入【推荐阅读】
???关注微信公众号:[芋艿的后端小屋]有福利: RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表 RocketMQ / MyCAT / Sharding-JDB ...
- [记录] 基于STC89C52RC的贪吃蛇三色游戏机设计(内含点阵驱动、数码管驱动详解)
目录 设计目标 需求分析 硬件设计 点阵模块 数码管模块 节拍信号发生电路 蜂鸣器电路 串口驱动电路.按键电路及MCU最小系统 软件设计 重要数据结构 蛇 显存 驱动 LED点阵驱动 74595驱动 ...
- 免疫组库数据分析(三):免疫组库数据可视化
免疫组库数据分析(三):免疫组库数据可视化 前言 在系列文章第二篇<免疫组库数据分析(二):Excel 分析免疫组库数据>中,分析了免疫组库中V基因.J基因.V-J组合的使用频率.在氨基酸 ...
- Arduino开发:网页控制ESP8266三色LED灯闪烁
根据板卡原理RGB三色LED对应引脚: int LEDR=12.int LEDG=14.int LEDB=13; 设置串口波特率为115200 Serial.begin(115200); 源代码如下所 ...
- 旺店通·企业奇门与金蝶云星空对接集成查询销售出库单连通[旺店通][销售出库单标准新增]-v1(旺店通->金蝶销售出库单--零售销售(手工运维))
对接源平台:旺店通·企业奇门 旺店通是北京掌上先机网络科技有限公司旗下品牌,国内的零售云服务提供商,基于云计算SaaS服务模式,以体系化解决方案,助力零售企业数字化智能化管理升级.为零售电商企业的订单 ...
- 因发货单,发的是销售件;销售出库单,出的是子件;没有报表可以看出我们的发货单,子件已发的数量,子件未发数量
[问题描述]因发货单,发的是销售件:销售出库单,出的是子件:没有报表可以看出我们的发货单,子件已发的数量,子件未发数量[先行处理过程][需求场景描述][是否已在最新补丁环境下测试验证][是否已检索知识 ...
- 龙芯1b(LS1B200)使用LVGL7.0.1组件的滑杆控件控制三色RGB灯的亮度
需求:通过三个滑杆,分别控制RGB三色灯的红绿蓝颜色.并显示0-100%的滑动数值 在这里我们使用LVGL库的滑杆 (lv_slider)组件来控制数值,并绑定回调事件,在回调事件中控制RGB灯的颜色 ...
最新文章
- Caffe 运行平台支持DenseNet模型
- oracle的一知半解
- 二等水准测量记录数据_公路水准测量培训道路放样测量学习
- org.junit.runners.model.InvalidTestClassError: Invalid test class ‘‘: 1. No runnable methods
- 网络流-SAP算法模板
- python开发转行做数据分析_转行学IT,Java、Python、大数据选择学哪个发展好?
- PinPhoto On OS X
- 随机数------选双色球
- 验证座机号码是否输入格式正确
- 计算机用户名,账户名更改
- 64位系统和32位系统区别
- 在线查看word,excel,pdf文件解决
- 【博学谷学习记录】超强总结,用心分享 | shell基础
- mac系统ionic开发ios app从安装到打包
- 什么是AOP,AOP能干什么,有什么优点
- 数字后端概念——Via
- 怎么用电视看电视台直播?看CCTV频道
- 内存映射mmap函数的理解
- Facebook速推帖子和Facebook广告有什么区别
- 从条码式电子存包柜到智能存储柜优势介绍