DPDK编程指南(翻译)( 十六)

16.报文分发库

DPDK报文分发器是一种库,用于在一次 操作中获取单个数据包,以支持流量的动态负载均衡。当使用这个库时,需要考虑两种角色的逻辑核:首先是负责负载均衡及分发数据包的分发逻辑核,另一个是一组工作逻辑核,负责接收来自分发逻辑核的数据包并对其进行操作。

操作模式如下图所示:

Figure 16 1 Packet Distributor mode of operation

在报文分发器库中有两种API操作模式:一种是使用32bit的flow_id,一次向一个worker发送一个报文;另一种优化模式是一次性最多发送8个数据包给worker,使用15bit的flow_id。该模式由rte_distributor_create()函数中的类型字段指定。

16.1.分发逻辑核操作

分发逻辑核执行了大部分的处理以确保数据包在worker之间公平分发。分发逻辑核的运作情况如下:

  • 分发逻辑核的lcore线程通过调用rte_distributor_process()来获取数据包。
  • 所有的worker lcore与distributor lcore共享一条缓存线行,以便在worker和distributor之间传递消息和数据包。执行API调用将轮询所有worker的缓存行,以查看哪些worker正在请求数据包。
  • 当有worker请求数据包时,distributor从第一步中传过来的一组数据包中取出数据包,并将其分发给worker。它检查每个数据包中存储在mbuf中RSS哈希字段中的“tag”,并记录每个worker正在处理的tag。
  • 如果输入报文集中的下一个数据包有一个已经被worker处理的tag,则该数据包将排队等待worker的处理,并在下一个worker请求数据包时,优先考虑其他的数据包。这可以确保不会并发处理具有相同tag的两个报文,并且,具有相同tag的两个报文按输入顺序被处理。
  • 一旦传递给执行API的所有报文已经分发给worker,或者已经排队等待给定tag的worker处理,则执行API返回给调用者。

Distributor lcore可以使用的其他功能有:

  • rte_distributor_returned_pkts()
  • rte_distributor_flush()
  • rte_distributor_clear_returns()

其中最重要的API调用是“rte_distributor_returned_pkts()”,它只能在调用进程API的lcore上调用。 它将所有worker core完成处理的所有数据包返回给调用者。在这组返回的数据包中,共享相同标签的所有数据包将按原始顺序返回。

注意:
如果worker lcore在内部缓存数据包进行批量传输,则共享tag的数据包可能会出现故障。一旦一个worker lcore请求一个新的数据包,distributor就会假定它已经完成了先前的数据包,因此具有相同tag的附加数据包可以安全地分配给其他worker,然后他们可能会更早地刷新缓冲的数据包,使数据包发生故障。

注意:对于不共享公共数据包tag的数据包,不提供数据包排序保证。

使用上述执行过程及returned_pkts API,可以使用以下应用程序工作流,同时允许维护由tag识别的数据包流中的数据包顺序。

Figure 16 2 Application workflow

之前提到的flush和clear_returns API调用可能不太用于进程和returned_pkts APIS,并且主要用于帮助对库进行单元测试。可以在DPDK API参考文档中找到这些功能及其用途的描述。

16.2.Worker Operation

Worker lcore是对distributor分发的数据包进行实际操作的lcore。 Worker调用rte_distributor_get_pkt() API在完成处理前一个数据包时请求一个新的数据包。前一个数据包应通过将其作为最终参数传递给该API调用而返回给分发器组件。

有时候可能需要改变worker lcore的数量,这取决于业务负载,即在较轻的负载时节省功率,可以worker通过调用rte_distributor_return_pkt()接口停止处理报文,以指示在完成当前数据包处理后,不需要新的数据包。

原文链接: http://www.jianshu.com/p/3d463fe5e1ad

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,806评论 25 707
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,650评论 24 1,002
  • 7.轮询模式驱动 DPDK包括1Gigabit、10Gigabit 及 40Gigabit 和半虚拟化IO的轮询模...
    半天妖阅读 5,426评论 0 4
  • 兰碧幽黄连暖韵, 枯树剪寒音。 月明清风那堪在? 袖挽秋水惊鸿起涟漪。 卷书二字负手立, 梦萦伶俜意。 无解万事空...
    故亭阅读 219评论 7 2
  • 新月形的弧度,新月形的衔接(花头与花径之间的衔接) 用龙柳编成新月形的框架 做框架时清楚龙柳是用作装饰性(可供观赏...
    奔跑的CY阅读 3,592评论 0 2