美文网首页
LB VIP CPU 推算

LB VIP CPU 推算

作者: 程序员札记 | 来源:发表于2023-03-19 08:36 被阅读0次

    对于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的向量,该向量将平方误差最小化。

    相关文章

      网友评论

          本文标题:LB VIP CPU 推算

          本文链接:https://www.haomeiwen.com/subject/yanerdtx.html