Optimized Flow Migration for NFV Elasticity Control
NFV弹性控制中的流迁移优化
ABSTRACT
- 基于动态创建和移除网络功能实例,NFV在网络功能控制上有很大的弹性。比如,网络功能和并,网络功能拆分,负载均衡等等。
- 那么为了实现弹性控制,就需要网络流量的重新分配。那么问题来了:哪些流量适合迁移,哪些流量不适合迁移?
- 这篇论文介绍了他们所编写的OFM控制器:优化了NFV弹性控制中的流迁移。
1. INTRODUCTION
- 刚刚也提到了,为了实现弹性控制(合并、拆分、负载均衡),我们需要一个有效的策略来控制流的转向。正好,SDN架构可以控制流的方向,那么结合SDN与NFV或许就可以实现我们的目标。
- 此外,NFs必须要为自己处理过的流保存状态信息。这是因为:如果执行功能拆分,新生成的NF必须要有父NF的一些信息,就好比C++中类的继承。
- 总结就是,不单单需要流的迁移,状态也要迁移 。列举一些研究:
Split/Merge and OpenNF rely on a centralized controller to transferstates between NF instances and buffer incoming packets to realize loss-free and order-preserving migration. On the other hand, enhanced OpenNF and other recent works, performed migration directly among NF instances to improve the scalability and performance of flow migration in NFV networks.
- 回到流迁移的问题上来,我们必须要选择合适的流进行迁移,如果选错了,则会造成下面的问题:
后果 | 描述 |
---|---|
缓冲区溢出 (系统角度) |
考虑两种流量:1. 状态转移之后(假设源NF不保留状态),到了源NF的流量。 2. 状态转移中,目的NF还未获得源NF的状态,这时到达目的NF的流量。这些 流量需要得到保存。通常,目的NF会与预先申请一块缓冲区来存放这些流量。 错误的流选择会造成elephant flow流入这个缓冲区,造成溢出(丢包),甚至 损坏NF。 |
高转移开销 (租户角度) |
NFV网络要满足SLA(Service Level Agreements),如果违反会遭到一定的处罚。 我们知道流的转移本来就会造成一定的额外处理时延,某些SLA对时延要求不高 (P2P传输),但是某些SLA要求低时延(股票交易)。因此错误的流选择很有能 严重违反某些SLA,从而遭到惩罚。引发不必要的开销。 |
无效的转移 (运营商角度) |
假设经过某一个NF的流量已经过载,如果这时我们只它那里转移走一小部分流量, 这并不能缓解过载的现状,这是无效的转移。但是请注意,如果我们转移走大部分 流量,也可能造成另一个NF过载。 |
- OFM控制器可以解决上述问题。可以实现NF控制的目标、最小化转移开销、避免缓冲区溢出。
- 下面是全文框架(OFM控制器做出的贡献)
- 第二部分:对NF控制进行了分类(NF扩展、NF负载均衡、NF故障恢复和NF升级)。并分析了每种情况下的触发条件以及如何选择转移流量。
- 第三部分:OFM控制器的设计。OFM控制器在运行时收集流统计信息和NF负载情况,并识别需要流迁移的情况。通过对缓冲区需求和迁移延迟的有效建模,OFM可以选择合适的转移流。
- 第四部分:基于
Floodlight
实现OFM控制器,运行实验,展示结果。证明OFM控制器可以完美的实现动态迁移控制。
2. ELASTICITY CONTROL SITUATIONS ANALYSIS
- 这部分讲了需要NF控制(个人理解就是需要流迁移)的情形。对每种情形进行分析。
2.1 NFV Elasticity Control Situations
- 论文列举了五种情形,进行分析。
- NF scaling out(迁出):如果一个NF过载,我们要怎么办呢?我们知道,NFV可以动态的创建新的NF实例。把过载NF上的一些流迁移到新创建的NF上可以缓解这个问题。这就是迁出。
- NF scaling in(迁入):为了节约资源,如果多个NF负载不足(流量没有那么多),我们可以关闭一些NF,并把通过它们的流转移到其中一台NF上。
- NF load balancing(负载均衡)在当前的NF中重新分配经过他的流(就是把经过它的流迁走一些),以防止潜在的NF过载情况。
- NF failure recovery(故障恢复):当一个NF发生故障,我们要把经过他的流迁移到其他正常运行的NF上去。这种情况我们不用注意流选择问题,因为所有流都要迁移。
- NF upgrading(更新):像软件一样,NF也会更新来获得更高的安全性。NFV也正好提供了NF的快速动态更新。我们需要做的就是把所有流量迁移到“最新”的NF上去。这种情况我们不用注意流选择问题,因为所有流都要迁移。
2.2 Flow Selection Goals for NFV Elasticity Control
- 从上面的分析中,我们观察到NF迁入、NF迁出、负载均衡的情况需要进行流选择。在本节描述了:对于上述三种情况,如何进行流选择。
- NF scaling out(迁出):过载NF上的流可能有SLA的约束,也有它自己的大小。要尽可能缩小违反SLA所带来的开销、避免大流量造成新的NF缓冲区溢出或过载以及转移小流量从而无效转移。
- NF scaling in(迁入):最小化NF数目,但是流迁移会带来额外的延迟,可能违反某些流的SLA约束。因此,我们需要将每个NF上迁移流的SLA代价与关闭NF带来的收益进行比较,找到最优迁移计划。同时还要避免过载和缓冲区溢出的情况。
- NF load balancing(负载均衡):负载均衡可以避免NF过载。不像迁出那样具有强制性,也不像迁入会带来收益。我们需要注意的问题:流迁移可能会带来额外的转发延迟,并导致SLA违规处罚。因此,我们应该选择合适的迁移流来平衡负载。
- 也有人提出了NF控制的迁移避免策略(主要针对于NF过载):当需要流量迁移时,现有的流还由当前NF处理,把新流引入新创建的NF。这篇论文在第五部分与迁移避免策略做了对比。
2.3 Design Challenges
- 本节介绍了设计OFM控制器的三个挑战,具体的技术细节在后面会介绍。
- Buffer overflow avoidance:我们知道,正在转移的时候,目的NF要缓存流量。通过观察发现:迁移不同的流,目的NF缓存流量的数目也不同。 OFM动态监测通过NF的流量,并预先计算迁移某条流所需要的缓冲区空间大小。
- Migration cost calculation:流迁移可能会带来额外的转发延迟,违反SLA约束,导致罚款。延迟随着迁移的流的数量而发生显著的变化。OFM基于要迁移的流的数量对流迁移延迟建模,并计算迁移成本。
- Effective flow selection for migration:像2.2节介绍的那样,三种情况有着不同的流选择策略。每一次的流选择都要考虑很多参数:NF负载、流量大小、不同流量的迁移延迟、关闭NF带来的收益和缓冲区成本。 OFM仔细设计了针对以上所有参数的独特算法。
3. OFM DESIGN
- 这节介绍了OFM控制器的实现,OFM的组件及工作流程如图所示:
- OFM控制器监视每个NF的状态,并检测出流量过载、负载不足和不平衡情况。
- 一旦NF需要进行流迁移,OFM根据自己收集到的信息(3.1),对每条流进行缓冲区分析(3.2)和迁移成本分析(3.3)。将分析结果输入最优迁移算法(3.4)得出哪条流最适合迁移。
- 最重要的是,OFM控制器一定要满足高及时性和高可靠性。
3.1 NF & Flow Status Collection and Condition Detection
3.1.1 流量统计
- 统计经过NF的流量是一项很重要的工作,如果简单的向NF中增加统计功能势必会增加NF的负担。
- OFM控制器统计流量的方法:利用OpenFlow提供的计数器功能,统计通过连接NF的边缘交换机的流量,再根据不同的NF对流量进行区分,加和获得某个NF的流量。
- OFM统计边缘交换机流量的方法:
计数器功能可以统计某条流表项匹配成功的数据包的数目,但是由于OpenFlow的多流表机制,想知道经过某台交换机所有数据包的数目必须要把每个流表的每条流表项的计数器加在一起。OFM控制器在此基础上进行了优化:在连接边缘交换机上新增一张流表(counter table)这张流表上的每条流表项的动作都是直接将数据包发给下一个流表。这张表的所有计数器加在一起就是通过这台交换机的所有数据包数目,再对时间求导就是流量。
3.1.2 状态鉴别
- 根据收集到的流量信息,OFM制定了状态判别的规则。假设有
n
个相同的NF。 - 一些符号说明:
符号 | 含义 |
---|---|
$ l_j,j\in[1,n] $ | 第$ j $个NF的负载 |
$ th_{top} $ | 某个NF负载的上限 |
$ th_{bottom} $ | 某个NF负载的下限 |
$ var(l_1,...,l_n) $ | 各个NF负载的方差,用来负载均衡 |
$ th_{var} $ | 可以接受的最大方差 |
- OFM制定的规则,用于状态判别:
状态 | 标志 |
---|---|
过载 | 只要有一个$ l_j \geq th_{top}$ |
低载 | 只要有一个$ l_j \leq th_{bottom} $ |
不平衡 | $ var(l_1,...,l_n) \geq th_{var} $ |
3.2 Buffer Cost Analysis
- OFM估计需要缓冲的流量大小,避免缓冲区溢出。
- 假设流 $ k $ 的比特速率为 $ size_k $ , 迁移时间为 $ la_{migration,k} $ 。 那么要为流 $ k $ 开辟的缓冲区大小 $ buffer_k $ 为: $$ buffer_k = size_k \times la_{migration,k} (1) $$
- 后面会介绍如何估计转移时间。
3.3 Migration Cost Analysis
- 流迁移会带来正面收益,比如在NF迁入时,关闭虚拟机带来资源上的收益;也会带来负面收益,比如迁移带来的延迟可能会违反SLA,从而受到惩罚。下面将详细介绍这两种收益。
3.3.1 SLA惩罚
- 对于延迟相关的SLA我们要调整整个NFV网络的最大转移延迟。
- 假设在 $ NF_j $ 上有 $ m $ 条流。SLA对第 $ k $ 条流的延迟要求是 $ SLA_k $ 那么第 $ k $ 条流的处理延迟 $ la_k $ 应该满足: $$ la_k \leq LA_k \ , k \in [1,m] $$
- 没有流迁移的情况下,流 $ k $ 的延迟等于 $ NF_j $ 处理这条流的时间,即: $$ la_k = la_{processing,k} $$
- 可以写出有流迁移的条件下,迁移延迟 $ la_{migration,k} $ 满足的条件: $$ la_{migration,k} \leq LA_k - la_{processing,j},k \in [1,m] (2) $$
- 计算SLA惩罚:SLA惩罚与违约流量的字节数,和违约时间成正比。设惩罚系数为 $ \beta $ 。根据公式(1)我们知道,在流 $ k $ 迁移时,会存放 $ buffer_k $ 字节的缓存。如果这次迁移违反了SLA,那么缓存的这些流量就是违约流量。设违约时间为 $ DT $ 有: $$ Penalty = \alpha + \beta \times buffer \times DT (3) $$
- 关于违约时间 $ DT $ 的计算:如果没有违约,那么 $ DT $ 就是零,SLA惩罚也是0。即: $$ DT_k = max(0,la_{migration,k}+la_{processing,k}-LA_k) (4) $$
- 完整的 $ Penalty_k $ 可表示为: $$ Penalty_k= \begin{cases} \alpha + \beta \times buffer_k \times DT_k , & \text { $ DT_k > 0 $ } \ 0 , & \text{ $ DT_k = 0 $ } \end{cases} (5) $$
- 接下来计算迁移时间 $ la_{migration,k} $ ,它由以下几个部分组成:
符号 | 含义 |
---|---|
$ t_1 $ | 控制器通知目标NF接受状态的时间 |
$ t_2 $ | 控制器通知源NF传输状态的时间 |
$ ts_k $ | 流 $ k $ 状态迁移的时间 |
$ tu $ | 流规则更新的时间(下流表使流转向目标NF) |
- 总结来说: $$ la_{migration,k} = t_1+t_2+ts_k+tu (6) $$
- 其中 $ t_1,t_2,tu $ 为常数, $ ts_k $ 可由下面的公式计算得来: $$ ts_k = \gamma + \eta \times f_n (7) $$
- 进一步得出 $ DT_k,buffer_k,cost_k $ 的表达式: $$ DT_k = max(0,(t_1+t_2+tu+\gamma + \eta \times f_n)+la_{processing,k}-LA_k) (8) $$
3.3.2 收益估算
- 在NF迁入时,每台虚拟机的价格(the cost of the VM per time slot)记为 $ PriVM_j $ 。
- 此外,我们还节约了虚拟机的运行时间(the time when VM load is under $ th_{bottom} $ ),根据历史数据算出它的平均值 $ TINT_{avg} $ 。
- 总的收益可表示为: $$ benefit_j = PriVM_j \times TINT_{avg},j \in [1,n] (11) $$
- 结合SLA开销和收益,写出总的 $ cost_j $ 表达式: $$ cost_j = \sum_{k=1}^{m} {Penalty_k} - benefit_j (12) $$
3.4 Optimal Flow Migration Calculation
- 本节介绍了三种状态下的最优流选择算法。
状态 | 目标 | 算法 |
---|---|---|
迁出(过载) | 最小迁移成本 | 贪婪 |
迁入(低载) | 最大收益 | 线性规划 |
不平衡(负载均衡) | 实现负载均衡,最小迁移成本 | 三步启发式算法 |
3.4.1 NF迁出
- 一种方案是:把过载NF上的一半流量迁移到新创建的NF上,因为这样子不止缓解了过载还可以实现负载均衡。但是这样做很有可能遭到严重的SLA惩罚。
- 实际上,过载时只需要迁出一部分流,让NF达到安全状态,我们定义了NF安全阈值 $ th_{safe,j} $ 。这个 $ th_{safe,j} $ 和我们之前定义的 $ th_{top} $ 不一样,峰值阈值可能是NF总容量的
80%
,这个安全阈值可能是总容量的60%
。 - NF迁出的ILP算法:假设一个NF $ j_1 $ ,它的负载是 $ l_{j1} $ 。 $ j_1 $ 已经过载,而且要把一些流迁移到 $ j_2 $ 上, $ j_2 $ 的缓冲区大小是 $ Buffer_{j2} $ 。 $ j_1 $ 上 有 $ m_{j1} $ 条流 $ f_1,f_2,...,f_{m_{j1}} $ 。 $ x_k $ 是一个
bool
变量,用来指示流 $ k $ 是否被迁移,那么我们就要求这个 $ x $ 向量。 - 线性规划算法如下:
目标函数: $ min\sum_{k=1}^{m_{j1}} { x_k \times Penalty_k } (13) $
约束条件:
(1) $ x_k \in {0,1} $ ,$ x_k $ 只能在0,1之间取值。
(2) $ \sum_{k=1}^{m_{j1}} {s_k \times bufffer_k \leq Buffer_{j2}} $ ,被迁移的流量需要缓冲区大小之和,不能超过 $ j_2 $ 提供的缓冲区大小。
(3) $ (load_k-th_{safe,k})\times capacity < \sum_{k=1}^{m_{j1}} {size_k} < load_k / 2 $ ,可以尽可能多的选择具有最小开销的流。
- 线性规划算法时间太长,采用如下贪婪算法:
- 算法思路很简单:每次都找到开销最小的流进行迁移,直到 $ j_2 $ 的缓冲区溢出或者迁移出一半的流或者达到安全感阈值 $ th_{safe,j} $ (因为这个时候在进行迁移只会造成无谓的开销)。
- Single Flow Migrate Time (SFMT).
The SFMT can be measured and calculated for different NF type
3.4.2 NF迁入
- 假设有 $ n $ 台低载的NF $ j_1,...,j_n $ ,它们的负载分别为 $ l_1,...,l_n $ ,经过它们流的数目分别为 $ m_1,...,m_n $ ,它们的缓冲区大小分别为 $ buffer_{j1},...,buffer_{jn} $ 。OFM控制器会把它们合并成一台NF并关闭其余空闲的NF。
- OFM用线性规划算法来解决NF迁入问题。设矩阵 $ X_{sd} $ , $ x_{sd}=1 $ 意味着 $ j_s $ 上的所有流转移到 $ j_d $ 上(不存在一个NF上的流转移到多个NF上的情况),然后关闭 $ j_s $ 。
- 目标函数和约束条件如下:
约束(1)保证了要么迁移,要么不迁移。
约束(2)保证了自己不能迁移到自己。
约束(3)保证了一个NF只能迁移到一个NF上。如果一个NF是被迁移对象那么它不能再迁移到别的NF上。
约束(4)保证了目标NF不过载。
约束(5)保证了目标NF不发生缓冲区溢出。
3.4.3 NF负载均衡
- 针对这个情况,OFM控制器采用了三步启发式算法。
- 主要思路:选取那些不违反SLA的流进行迁移。
- 普通的做法是:实行流重新分配,为每个NF都分配同样大小的流量。这样很可能造成大规模迁移引发SLA惩罚。
- OFM做法:计算出平均负载,收集超过平均负载的NF上的额外流,集合起来再迁移到低于平均负载的NF上。
第一步:计算平均负载 $ l_{avg} $ ,把负载大于 $ l_{avg} $ 的NF加入 $ NFList_{heavy} $ ;把负载小于 $ l_{avg} $ 的NF加入 $ NFList_{light} $ 。
第二步:对 $ NFList_{heavy} $ 中的每个NF算出它们的额外负载 $ l_{extra,j} $ ,选出 $ NF_j $ 上不违反SLA的流加入 $ FlowList_j $ ,并降序排列(这样可以快速缓解负载不均衡的现状)。
第三步:把每个 $ FlowList_j $ 上的流集合成 $ FlowList $ ,根据bin-packing
算法从中挑选流,并转移到 $ NFList_{light} $ 中的NF上。对于那些没有被选中的流,不做任何操作。