对于LB这种网络类系统来说,带宽(bandwidth)和CPU是两大类资源开销。所谓的“hot LB”问题所关切的资源对象具体是指什么呢?
在10G LB时代是带宽。
在40G LB时代,CPU赶在带宽前面成为新的瓶颈。
这个变化也给我们带来了一个新的难题:我们怎么知道某个VIP迁移后,原有LB上能降低多少CPU开销呢?令人沮丧的是,即使LB厂商也没有这样的数学模型。
在半自动化时代,我们的做法是:
人工选一个qps最高(或者bps最高)的VIP,启动迁移。
等迁移完之后,复查原先LB的CPU情况。
如果还超出阈值,则重复步骤1和步骤2。
为什么需要做第3步的复查呢?原因是缺乏模型,我们无法知道这个VIP迁移后,对CPU下降的实际效果如何。简单来说,就是“迁一个VIP试试,看看效果”。
所以我们必须要有这样的模型。假设这么一个情况:
某一台hot LB目前CPU峰值是80%,而目标CPU峰值为65%。其上有100个VIP,如果我们根据数学模型和qps、bps监控数值,计算出对应消耗的CPU资源:
VIP1: 8% CPU
VIP2: 7% CPU
VIP3: 3% CPU
VIP4: 2% CPU
…
由于我们的目标是迁走至少15%的CPU开销,那么由于VIP1和VIP2的CPU开销正好是15%(8%+7%),我们的全自动化就可以选择这两个VIP进行迁移。
我们相信,流量特征(rps, IN bps, OUT bps)确定的VIP,其对应的CPU开销值应该也是可以确定的(至少能缩小到某一个精度区间之内)。从原理上说,VIP的流量,本质上是数据包在LB的网卡、L4处理(TCP)、L6处理(TLS)、L7(HTTP)处理上的开销。我们逐一分析:
rps的因素:rps恒定的情况下,CPU跟bps成正比。
bps的因素:bps恒定的情况下,CPU跟包量(pps)成正比。
TLS的因素:https跟http相比,因为多了TLS加解密环节,所以会消耗更多CPU。
设备型号的因素:同样流量特征的VIP,其CPU开销在新型号LB上小,在旧型号上大。
如果有这么一个数学模型,输入值包括:qps, bps, protocol, hardware model,输出值是CPU开销,那么这个“如何选择合适的VIP做迁移”的问题,就能答上一大半了。另外一小半主要跟业务特点相关。这个问题其实就转化一个数学问题。 如果根据多个变量拟合一个函数。
如何在python中计算一条最佳拟合线,然后在matplotlib中将其绘制在散点图上?
用普通最小二乘回归计算线性最佳拟合线,如下所示:
from sklearn import linear_model
clf = linear_model.LinearRegression()
x = [[t.x1,t.x2,t.x3,t.x4,t.x5] for t in self.trainingTexts]
y = [t.human_rating for t in self.trainingTexts]
clf.fit(x,y)
regress_coefs = clf.coef_
regress_intercept = clf.intercept_
这是多变量的(每种情况都有很多x值)。所以,x是一个列表,y是一个列表。
例如:
x = [[1,2,3,4,5], [2,2,4,4,5], [2,2,4,4,1]]
y = [1,2,3,4,5]
但是如何处理高阶多项式函数呢?例如,不仅仅是线性的(x对m=1的幂),而是二项式的(x对m=2的幂),四次方的(x对m=4的幂),等等。例如,如何从下面得到最佳拟合曲线?
摘自Christopher Bishops的“模式识别和机器学习”,第7页:
最佳答案
this question
提供a small multi poly fit library这将完全满足您使用numpy的需要,并且您可以将结果插入到绘图中,如我下面概述的那样。
您只需将X和Y点数组以及所需的拟合度(顺序)传递到multipolyfit
中即可。这将返回可用于使用numpy的polyval绘制的系数。
注:下面的代码已修改为进行多变量拟合,但绘图图像是早期非多变量答案的一部分。
import numpy
import matplotlib.pyplot as plt
import multipolyfit as mpf
data = [[1,1],[4,3],[8,3],[11,4],[10,7],[15,11],[16,12]]
x, y = zip(*data)
plt.plot(x, y, 'kx')
stacked_x = numpy.array([x,x+1,x-1])
coeffs = mpf(stacked_x, y, deg)
x2 = numpy.arange(min(x)-1, max(x)+1, .01) #use more points for a smoother plot
y2 = numpy.polyval(coeffs, x2) #Evaluates the polynomial for each x2 value
plt.plot(x2, y2, label="deg=3")
注意:这是前面答案的一部分,如果没有多变量数据,它仍然是相关的。不要使用coeffs = mpf(...
对于非多变量数据集,最简单的方法可能是使用numpy'scoeffs = numpy.polyfit(x,y,3)
:
polyfit
最小二乘多项式拟合。
将度numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)
的多项式拟合到点p(x) = p[0] * x**deg + ... + p[deg]
。返回系数p的向量,该向量将平方误差最小化。
网友评论