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库(单速率三色算法)相关推荐

  1. html 体温单源码,体温单 三色单

    [实例简介] 根据护理记录数据绘出体温单,三色单,附带源码 [实例截图] [核心代码] 体温单控件源码 └── 体温单控件源码 ├── TemperatureChart.dll ├── 体温单源码+数 ...

  2. 垃圾收集器以及三色标记

    分代收集理论 当前虚拟机的垃圾收集采用分代收集算法,只是根据对象存活周期的不同将内存分为几块. 一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法 新生代:每次 ...

  3. 数据库中间件 MyCAT源码分析:【单库单表】插入【推荐阅读】

    ???关注微信公众号:[芋艿的后端小屋]有福利: RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表 RocketMQ / MyCAT / Sharding-JDB ...

  4. [记录] 基于STC89C52RC的贪吃蛇三色游戏机设计(内含点阵驱动、数码管驱动详解)

    目录 设计目标 需求分析 硬件设计 点阵模块 数码管模块 节拍信号发生电路 蜂鸣器电路 串口驱动电路.按键电路及MCU最小系统 软件设计 重要数据结构 蛇 显存 驱动 LED点阵驱动 74595驱动 ...

  5. 免疫组库数据分析(三):免疫组库数据可视化

    免疫组库数据分析(三):免疫组库数据可视化 前言 在系列文章第二篇<免疫组库数据分析(二):Excel 分析免疫组库数据>中,分析了免疫组库中V基因.J基因.V-J组合的使用频率.在氨基酸 ...

  6. Arduino开发:网页控制ESP8266三色LED灯闪烁

    根据板卡原理RGB三色LED对应引脚: int LEDR=12.int LEDG=14.int LEDB=13; 设置串口波特率为115200 Serial.begin(115200); 源代码如下所 ...

  7. 旺店通·企业奇门与金蝶云星空对接集成查询销售出库单连通[旺店通][销售出库单标准新增]-v1(旺店通->金蝶销售出库单--零售销售(手工运维))

    对接源平台:旺店通·企业奇门 旺店通是北京掌上先机网络科技有限公司旗下品牌,国内的零售云服务提供商,基于云计算SaaS服务模式,以体系化解决方案,助力零售企业数字化智能化管理升级.为零售电商企业的订单 ...

  8. 因发货单,发的是销售件;销售出库单,出的是子件;没有报表可以看出我们的发货单,子件已发的数量,子件未发数量

    [问题描述]因发货单,发的是销售件:销售出库单,出的是子件:没有报表可以看出我们的发货单,子件已发的数量,子件未发数量[先行处理过程][需求场景描述][是否已在最新补丁环境下测试验证][是否已检索知识 ...

  9. 龙芯1b(LS1B200)使用LVGL7.0.1组件的滑杆控件控制三色RGB灯的亮度

    需求:通过三个滑杆,分别控制RGB三色灯的红绿蓝颜色.并显示0-100%的滑动数值 在这里我们使用LVGL库的滑杆 (lv_slider)组件来控制数值,并绑定回调事件,在回调事件中控制RGB灯的颜色 ...

最新文章

  1. Caffe 运行平台支持DenseNet模型
  2. oracle的一知半解
  3. 二等水准测量记录数据_公路水准测量培训道路放样测量学习
  4. org.junit.runners.model.InvalidTestClassError: Invalid test class ‘‘: 1. No runnable methods
  5. 网络流-SAP算法模板
  6. python开发转行做数据分析_转行学IT,Java、Python、大数据选择学哪个发展好?
  7. PinPhoto On OS X
  8. 随机数------选双色球
  9. 验证座机号码是否输入格式正确
  10. 计算机用户名,账户名更改
  11. 64位系统和32位系统区别
  12. 在线查看word,excel,pdf文件解决
  13. 【博学谷学习记录】超强总结,用心分享 | shell基础
  14. mac系统ionic开发ios app从安装到打包
  15. 什么是AOP,AOP能干什么,有什么优点
  16. 数字后端概念——Via
  17. 怎么用电视看电视台直播?看CCTV频道
  18. 内存映射mmap函数的理解
  19. Facebook速推帖子和Facebook广告有什么区别
  20. 从条码式电子存包柜到智能存储柜优势介绍

热门文章

  1. 为什么选用one-hot?
  2. 欧拉操作系统(openEuler)简介
  3. 内网穿透+sshpass
  4. linux内存管理页面,【原创】(七)Linux内存管理 - zoned page frame allocator - 2
  5. 区块链技术之钱包技术
  6. 论《北京爱情故事》中石小猛的爱情
  7. YOLO模型 训练及预测
  8. 张向宁:窄告将让中国营销成本下降10倍
  9. unity 手电筒光源SpotLight
  10. 缩招,招生100人!北京大学软微学院软件工程第二学位开始招生!