周五了解到一个叫做Flowlet的东西,比较有意思。大体上说来,它是由一个问题而引出的一个解决方案,由于理解还不够深入,所以也暂时只能这么说。

  我先从问题说起。

ISP的动态负载均衡

由于公共骨干网上流量的不确定性,每一条链路的负载不尽相同,为了保证总带宽的最佳利用率,ISP往往会做一些动态负载均衡的策略。如下图所示:

  • 时刻1:

  • 时刻2:

packet负载均衡和flow负载均衡

到底是按照packet做负载均衡呢还是按照一个五元组flow来做负载均衡呢?这是一个问题,很多人在做负载均衡的时候都会面临这个选择问题。

  具体来讲,如果一条flow是强序的,那么基于packet的负载均衡将会导致乱序,这是设备在做负载均衡时要避免的,比如TCP就不能基于packet来做负载均衡,而对于UDP这种协议便可以。

  目前从主机到中间设备,几乎所有的从板卡,网卡队列,到CPU中断,到hash算法,均有机制保证TCP的强序性。

TCP的问题

正是由于TCP是强序的,所以TCP便无法基于packet做负载均衡,也就意味着,只要一条TCP流已经发起了,它就几乎不能再改变底层链路了,至少是最好不要改变底层链路,因为一旦底层链路改变,TCP将增加面临乱序的概率。

幸亏TCP是burst发送

前面我的描述其实隐含了一个假设,即TCP flow的packet是平滑发送的:

然而实际上,不管是实际抓包(你可以观测抓包的tcptrace图)还是从具体实现(你可以看30年内任何TCP实现的源码,比如cubic,vegas…)上看,你会发现TCP packet的发送其实是burst的:

哈哈,可乘之机!看到两批次burst之间的时间间隙没有,在这种间隙足够大的时候切换下层链路是一个好的时机。这意味着旧链路上的packet均已经离开了链路或者至少将要离开链路,这个时候切换链路将不会造成乱序,不会破坏TCP的强序要求。

  嗯,这就是Flowlet。


Flowlet

一般而言,英文中的“-let”后缀代表“微小”的意思,比如booklet,houselet,以及Java applet…一个Flowlet代表的就是一条小流。如下图所示:

在宏观的观感上,可以把一条flow看成是多个flowlet组成的,负载均衡现在就是基于flowlet来进行了,好吧,又引入了一个中间层,它既不是packet,也不是flow,而是大于packet小于flow的flowlet,哈哈,很有意思!

  那么到底如何定量的去切分flowlet呢?这里给出一个公式:

已知两条链路的延迟分别为D1,D2,设一个数α,当α满足下面的条件:已知两条链路的延迟分别为D1,D2,设一个数α,当α满足下面的条件:已知两条链路的延迟分别为D_1,D_2,设一个数\alpha,当\alpha满足下面的条件:
α>|D1−D2|α>|D1−D2|\alpha > |D_1-D_2|
一条flow便可以通过α来切割为不同的flowlet一条flow便可以通过α来切割为不同的flowlet一条flow便可以通过\alpha来切割为不同的flowlet

αα\alpha建议50ms50ms50ms应该不错了。

BBR之后一切将不再

我个人觉得flowlet的理念非常Q,perfect,通过一个新的层次解决了强序flow的负载均衡问题。然而它借用了一个TCP实现上的问题或者说是bug,即burst机制。所谓借着坏事干好事。

  在TCP的AIMD模型下,pacing发送几乎是不可能的,因为pacing的计算会破坏AIMD的盲决策,最终的控制模型将会畸变。然而近期Google的研究证明简单的AIMD用于TCP传输其实是错误的,而引入了一中新的BBR pacing传输模型,这个BBR一下子把TCP拥塞控制算法引入了2.0时代!

  我想表达什么?

  在BBR pacing模型下,我们假设BBR已经完美升级到了它应该成为的样子,解决了一系列的失速,误判等问题,届时TCP packet的发送将会是下面的样子:

你可能再也捕捉不到那个flowlet中的αα\alpha了,因为pacing rate的精确计算机制不会允许αα\alpha那么久的空窗期存在!

  但BBR最终至多只是终结了flowlet在TCP上的具体实现,它无法终结flowlet的理念。拥塞控制和负载均衡是两个不同的领域,虽然有所关联但却井水不犯河水,拥塞控制说的是,当发现拥塞,要怎么做,负载均衡说的是,它可以帮忙分担拥塞。

Linux RFS中的影子

上周写的那篇:
合并N个有序链表与FQ公平调度:https://blog.csdn.net/dog250/article/details/80234049
我找到了一道面试题或者说作业题在Linux中的影子,在我第一次听闻flowlet的昨天,我想Linux RPS/RFS也有该理念的实现,具体看下面这段代码:

/** If the desired CPU (where last recvmsg was done) is* different from current CPU (one in the rx-queue flow* table entry), switch if one of the following holds:* ...*   - The current CPU's queue tail has advanced beyond the*     last packet that was enqueued using this table entry.*     This guarantees that all previous packets for the flow*     have been dequeued, thus preserving in order delivery.*/
if (unlikely(tcpu != next_cpu) &&(...((int)(per_cpu(softnet_data, tcpu).input_queue_head -rflow->last_qtail)) >= 0)) {tcpu = next_cpu;rflow = set_rps_cpu(dev, skb, rflow, next_cpu);
}

后记

非常感激总是有人帮助我让我重新思考技术的本质!今天周六一觉睡到8点半,所以这篇文章到了10点多才分享出来,迟来了,但总比没有好。

  对flowlet理解不深,不到一日而已,如果有需要讨论的,或者说发现我的说法有错误的,希望能及时指出,我会及时回复。

  上午积累了很多的家务事,申请了延后执行,这快到中午了,估计也干不完了,疯子大人和小小马上也就回来了,等待接受批评,但能总结出这篇文章,也算欣慰了。

非常有意思的Flowlet相关推荐

  1. 7个小众却很有意思的工具推荐,每一个都是大宝藏!

    作为一个工具控,自己也体验了上百个软件和网站,今天给大家推荐7个小众很有意思的工具,喜欢的话记得点赞支持哦~ 1.正版中国 正版中国是一个分享正版软件限时免费信息的网站.有很多优质的正版软件会做一些限 ...

  2. 发现一个有意思的博主(科研工作者)

    科学网  这个社区好像都是大学老师? 发现一个有意思的博主,王立新的博客: http://blog.sciencenet.cn/u/fuzzywanglixin 博主写的文章有点意思啊,感觉很是犀利. ...

  3. 一个有意思的逻辑训练题目

    题目如下: 有两个大于1小于100的自然数x,y,老师告诉小明两个数的和,告诉小强两个数的积.已知小明和小强足够聪明. 下面是两个人的对话: 小强:我不知道这两个数是多少.(<沉默中>.. ...

  4. 一个有意思的项目,快上车!

    不啰嗦,这个有意思的项目是:大家一起来写 2022 日历吧! 别着急,我来慢慢交代两件事儿: 一.编程日历<了不起的程序员2021>"开源"了: 二.编程日历<了 ...

  5. debug打印的有意思的方法

    #define DEBUG(FORMAT,...) \printf("[ %s] [ %s %d] " FORMAT"\n",__FILE__,__func__ ...

  6. 一个很有意思的问题: 揭示了计算机程序问题的一般处理思路

    2019独角兽企业重金招聘Python工程师标准>>> 一个很有意思的问题: 揭示了计算机程序问题的一般处理思路 === 问题标题: 如何统计汉字的字数? 问题内容: 我想统计: & ...

  7. 外包公司做遗留项目有意思么?

    过年后,在目前公司的工作就要告一段落了,又恰逢年终,终觉得还是要总结点什么 背景介绍 考虑了一下,似乎技术上没有什么太多可说的,再加上外包项目也不能透露太多客户的东西.3年多做得都是同一个Accoun ...

  8. 一道有意思的css面试题,9宫格

    今天出去面试,遇到了一道有意思的面试题:写一个css9宫格,要求边框是5px,鼠标hover的时候边框变色. 当时没有答出来,回来想了两个写法感觉都不是最优解. 1.html部分 <ul> ...

  9. 一次非常有意思的sql优化经历

    一次非常有意思的sql优化经历 原文:一次非常有意思的sql优化经历 场景 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表 create table Course(c_id int PR ...

  10. 分摊的意思_接了两单顺风车遇到几个有意思乘客,后来把顺风车软件删了

    我以前是一个滴滴司机,有时候会接到一些跨跨城的订单,就注册了一个滴滴顺风车,毕竟有时候是接个顺风车,会省点油钱和过路费用,这几年的时间内,只接了两个顺风车的订单,没想到遇到了挺有意思的几个乘客. 大概 ...

最新文章

  1. 在WebView中如何让JS与Java安全地互相调用
  2. 【Node.js】http-server 实现目录浏览服务
  3. 【渝粤教育】国家开放大学2018年春季 0434-21T高级英语口语 参考试题
  4. objective-C 的OOP(上)--类定义、继承及方法调用
  5. 马尔可夫不等式 Markov's inequality
  6. 关于上采样方法总结(插值和深度学习)
  7. 配置扩展IP ACL实验
  8. 使用geohash实现查找附近的人
  9. python布尔类型的两个值_布尔人有两个可能的值。是否有三种可能值的类型?
  10. YTU 2577: 小数计算——结构体
  11. 案例:电商交易数据分析
  12. word转pdf时,图片错位,乱跑
  13. Android隐藏应用程序的图标
  14. 什么是css Hack
  15. 英语读书笔记-Book Lovers Day 03
  16. 接入支付宝手机网页支付详解
  17. 使用AudioServices相关接口(底层c接口)的连续震动实现(ios)
  18. 建立完善的员工晋升机制_建立合理的晋升机制,给员工发展的空间
  19. python 嵌套函数及其练习题
  20. win11不兼容很多游戏?win11不兼容哪些游戏

热门文章

  1. 【379】pandas 说明
  2. redis实现分布式锁的几种方式
  3. 飞凌OK6410A 多媒体视频编解码 player-qt4 QT视频播放器
  4. 析取 合取 析取范式 合取范式
  5. apq用linux镜像,apq模拟器如何使用 apq模拟器使用方法教程
  6. php设备巡检管理,设备巡检管理解决方案
  7. $(html) 原生js,原生js仿jquery一些常用方法(必看篇)
  8. C++深入学习笔记—基础篇—个人银行账户管理程序
  9. 爬取虾米音乐flac高品质下载
  10. 饱受诟病的白板面试,为什么沿用至今?