准确地预测工作负载可以使网络服务提供商实现应用程序的主动运行管理,确保服务质量和成本效益。对于云原生应用程序来说,多个容器协同处理用户请求,导致每个容器的工作负载变化受到工作负载组行为的影响。然而,现有方法主要分析每个容器的个体变化,没有明确建模容器工作负载组的演化,导致结果次优。因此,我们提出了一种工作负载预测方法 GROUP,将重点从个体转移到组别的工作负载预测焦点,从数据相似性到数据相关性的工作负载组行为表示,以及从隐式建模到显式建模的工作负载组行为演化。首先,我们从多个角度对工作负载组行为及其演化进行建模。其次,我们提出了一个容器相关性计算算法,考虑容器的静态和动态信息来表示工作负载组行为。第三,我们提出了一个端到端的多步骤预测方法,明确描述了工作负载组行为的演化与每个容器的工作负载变化之间的复杂关系。最后,对公共数据集进行了足够的实验,显示了 GROUP 的优势,为实现云原生应用程序的工作负载预测提供了一种有效的解决方案。
云原生已成为现代Web应用的重要设计范式,云原生应用主要以容器化微服务架构 [14] 的形式产生。微服务架构通过将复杂应用拆分为具有单一功能的服务,以减少应用之间的耦合 [5]。容器是一种内核级虚拟化技术,具有更高的性能和效率 [7]。因此,整个应用通过多个容器相互交互来处理用户请求,使得容器的工作负载变化不再仅仅是每个容器的个体行为,而是多个容器的群体行为。
大部分现有的工作负载预测方法 [8–10, 12, 15, 20, 25, 29, 30] 都是独立地对每个容器的工作负载变化进行建模和预测。因为每个容器的工作负载数据以时间序列的形式记录,这些方法认为每个容器未来的工作负载变化仅与其自身的历史工作负载数据相关,这是由时间序列预测问题的自然时间相关性引起的。然而,云原生应用是一个分布式系统,多个容器一起处理用户请求。因此,仅关注预测容器的个体行为只能达到次优结果。此外,由于动态的云环境 [12],历史工作负载数据中存在大量数据噪声 [2],这使得这些方法对数据噪声的敏感性较高。
少数方法还考虑了工作负载变化的群体行为。Shaw等人 [26] 发现了虚拟机(VM)之间的工作负载变化相关性,但仅适用于共同部署以考虑资源的互补性。Ruta等人 [24] 提出了一个基于BiLSTM的工作负载预测模型,该模型将所有设备序列的工作负载序列作为输入,但没有考虑设备之间的工作负载变化是否相关。Banerjee等人 [1] 和Ding等人 [6] 主要通过在原始数据上获取高度相似的工作负载序列来生成回归预测模型。然而,对于云原生应用来说,首先,不同容器的工作负载变化可能有两种关系:相似性(复制运行在副本容器上的业务功能)和相关性(运行在不同容器上属于同一服务调用链的不同业务功能),因此上述方法丢失了有价值的数据;其次,上述方法通过将特征数据输入简单回归方法来隐式地建模工作负载组行为的演化。但是,工作负载组行为的演化不是单阶段的,而是多阶段相关的。隐式方法只能提取部分信息,无法描述工作负载组行为演化的复杂性。
总之,现有方法仍然存在几个重要缺陷,包括缺乏对工作负载组行为及其演化的明确建模、缺乏有效的方法来评估容器之间的相关性以表示工作负载组行为,以及缺乏系统地利用工作负载组行为进行预测。因此,现有方法对于云原生应用程序的工作负载预测是不可靠的。
要构建一个明确的端到端工作负载预测模型,需要解决两个具有挑战性的问题。
因此,我们提出了一种名为 GROUP 的新型端到端工作负载预测方法,专注于工作负载组行为。我们的工作的关键贡献如下:
关注个体行为的方法:大多数现有方法 [8-10, 12, 15, 20, 25, 29, 30] 仅独立地对每个容器的工作负载进行建模和预测,它们使用时间序列中记录的历史工作负载数据来建模数据点之间的时间依赖关系。El Kassabi 等人 [9] 提出了一种采用自回归移动平均(ARIMA)的资源短缺预测方法,这是一种仅考虑数据点之间的时间依赖关系的单变量预测方法。Duggan 等人 [8] 提出了一种基于 RNN 的多步工作负载预测方法,考虑到个体工作负载的变化。通过使用不同的高级时间步骤,它展示了多步预测的需要和有效性。Krannichfeldt 等人 [30] 提出了一种单步预测模型,将批量学习和在线学习进行整合,使用多个离线生成的本地预测器获得基本结果,然后通过在线集成来预测未来的工作负载。Saxena 等人 [25] 提出了一种工作负载预测模型,通过应用自适应差分进化(AADE)算法从历史数据中自适应地学习工作负载痕迹。Feng 等人 [10] 提出了一种综合的工作负载预测方法,考虑到所预测容器的宏观和微观工作负载变化,通过自适应滑动窗口方法和时间局部性集成策略实现更好的结果。然而,以上方法只关注所预测对象的个体行为。对于分布式云原生应用程序,它们忽略了工作负载组行为的分析和建模,因此导致了次优的结果。
关注组行为的方法:也有一些方法 [1、6、24、26] 考虑到工作负载变化的组行为。Ruta 等人 [24] 提出了一个三层 BiLSTM 网络,统一对所有不同设备序列进行训练以预测未来的工作负载变化,考虑到不同设备的工作负载系列之间的交互。但它没有考虑不同设备之间的工作负载变化是否相关。Banerjee 等人 [1] 提出了一种多步工作负载预测方法,将机器学习聚类和预测技术结合起来,以预测VM未来的资源消耗,其中聚类旨在识别具有相似的资源使用模式的VM组。Ding 等人 [6] 提出了一种综合的容器工作负载预测方法,考虑到容器组的组行为。它引入了容器相似性计算算法,用于识别具有相似模式的容器工作负载序列。然而,他们只考虑具有相似模式的工作负载序列作为输入,失去了宝贵的相关数据。此外,他们通过简单的机器学习方法预测未来的工作负载,不能描述工作负载组行为演化的复杂过程。
首先,我们为云原生应用程序定义工作负载组行为。假设容器 ci 的原始工作负载数据序列从 t0 到 tN是 。为了识别容器的工作负载组行为,我们将每个容器的工作负载特征建模为包含以下四个组成部分,这些部分代表了每个容器的数据、趋势、季节和细节方面的工作负载变化。
定义3.1 工作负载组行为:多个容器在同一特征fx(数据、趋势、季节和残差特征之一)上的工作负载变化相关。
工作负载组行为现象显著存在。由于云原生应用程序采用容器化微服务架构,多个容器协作处理用户请求,主要表现为:运行于重复容器上的重复的业务功能和运行于不同容器上的不同业务功能属于同一个服务调用链。因此,很容易在特定特征(数据、趋势、季节和残差特征之一)上形成工作负载组行为。
然后,我们进一步分析工作负载组行为的演变,并提出了其四个阶段的演变。
定义3.2 工作负载组行为内部演变:属于同一工作负载组行为的不同容器之间的工作负载变化关系。
数学描述如下: 其中是建模不同容器之间的工作负载内部演变的函数,它们属于同一工作负载组行为 。
定义3.3 工作负载组行为时间演变:整个工作负载组行为在时间线上较早的数据和后来的数据之间的工作负载变化关系。
由于多个容器的工作负载组行为 随时间演变,因此需要注意时间线上工作负载组行为的相关性。数学描述如下:
其中是建模工作负载组行为的时间演变的函数,k表示历史预测周期的数量,因此历史工作负载序列包含总共 k*m 个时间步的记录。
定义3.4. 工作负载组多特征演化:是指不同特征对应的工作负载组行为之间的工作负载变化关系,包括数据、趋势、季节和残差特征。由于不同工作负载特征描绘了工作负载变化的不同方面,因此需要关注不同特征对应的工作负载组行为之间的演化关系。数学描述如下:
其中,是用于建模不同特征对应的工作负载组行为的多特征演化函数。
定义3.5. 工作负载组多尺度演化:是指不同采样尺度(宏观、中观和微观)对应的工作负载组行为之间的工作负载变化关系。由于采样尺度直接决定了工作负载变化的模式,因此将采样尺度分为三个级别,即大(L1)、中(L2)和小(L3),分别描绘了三种工作负载变化模式,即宏观、中观和微观变化。重新采样的工作负载序列定义如下:
其中,a={0, 1,…},F是任意聚合函数,通常可以采用观察值函数、最大值函数和平均值函数等。不同尺度上的工作负载组行为会影响容器的工作负载变化,因此需要关注不同尺度对应的工作负载组行为之间的演化关系。数学描述如下:
其中,是用于建模不同尺度对应的工作负载组行为的多尺度演化函数。
图1展示了GROUP的框架。首先,图1(a)展示了提出的容器相关计算算法用于表达工作负载组行为的过程。简言之,基于STL分解方法[23],从每个容器的原始工作负载序列中获得四个特征序列(包括数据、趋势、季节和残差序列)。然后,基于考虑静态和动态容器信息的容器相关计算算法,得到一组与对应特征相关性高的不同容器特征序列。最后,基于序列之间的相关信息,通过实际特征预处理操作获得表示工作负载组行为的3D输入张量。其次,图1(b)展示了考虑工作负载组行为演化的深度学习多步预测模型的结构。具体来说,基于获得的3D输入张量,工作负载组行为的内部、时间、多特征和多尺度演化分析模块分别执行其各自的功能,以实现工作负载组行为演化特征的明确提取和转换。值得注意的是,GROUP可以解决单一预测任务或多重预测任务,即预测单个容器或同时预测多个容器。由于篇幅限制,本文主要关注解决单一预测任务。
假设云原生应用包含n个容器,并且预测的容器是。我们对每个容器的工作负载序列采用滑动窗口[11]进行批处理,处理一个固定时间段内的字序列。假设滑动窗口大小为sw=k∗m,其中k表示每个样本的历史预测周期数。因此,每个容器的工作负载子序列将形成一个3D张量,大小为1×1×sw。
(1) 工作负载序列分解:时序分解是时序分析的一种流行方法。加性分解是工作负载序列的常用方法[15],因为它允许通过总和趋势T、季节S和残差R成分来获取原始序列D,如图2和等式6所示。
我们采用Loess的季节和趋势分解(STL)[23],这是一种普遍的加性分解方法。如图3所示,每个容器的原始工作负载序列可以转化为包括数据D、趋势T、季节S和残差R序列的四个特征序列。最后,每个特征序列将形成一个3D张量,大小为1×1×w。
(2) 工作负载相关计算:为了有效地获得不同容器之间的相关工作负载序列,我们提出了一种基于容器静态和动态信息的容器相关计算算法。
a. 静态相关计算:首先,基于静态相关性,我们根据预测容器c筛选出与其相关的容器。受[6]的工作启发,我们提出了三类用于描述容器自身、内部任务或服务和外部环境的静态指标,如表2所示。详细说明在附录的第5小节中。
基于每个容器的静态指标,可以获得两个容器之间的静态相关系数S(cx,cy)。
阈值是可接受的静态相关性阈值,是第i个度量标准的相关因子,是容器cx的第i个度量标准的值。而度量标准CodeInfo 用于识别具有相同业务或属于同一服务调用链的容器。其他度量标准使用两个容器之间的度量值一致性来决定它们是否相关。
b. 动态相关性计算 其次,我们基于动态相关性对容器进行精细选择。交叉相关是一种用于时间滞后时间序列的著名相关度量算法,已广泛应用于信号处理和时间序列分析[27]。交叉相关的思想是在考虑振幅和相位失真的情况下,衡量两个时间序列之间的形状相似性。
给定两个时间序列,交叉相关总是将一个序列(例如Y)保持静态,对于每一个取自另一个序列X的延迟s在时间轴上划过Y以获取每个滑动窗口的内积值R。由和Y所得的交叉相关值C(, Y)如下所示:
其中是具有滑动窗口的序列,滑动窗口上的缺失值填充为0。
然后,通过枚举不同的滑动窗口值s,我们可以得到长度为2l-1的交叉相关值向量vc。假设vc的最大值和最小值分别为maxC和minC,并对应于滑动窗口的延迟s1和s2。序列X和Y的交叉相关得分C(X,Y)可以计算如下:
其中C(X, Y)∈[-1, 1],C越接近1或-1,X和Y之间的相关性越强。此外,正值表示X和Y以相同的方向变化;反之,它们以相反的方向变化。我们设置阈值,如果绝对值|C(X, Y)|小于,则X≁Y;否则,X∼Y。
因此,我们可以获得不同序列之间的三个相关性指标,包括相关度、相关方向和相关时间滞后。如图4所示,我们按照C得分的降序排列它们。最终,对于工作负载的每个特征,我们可以获得与预测容器最高相关性的容器。
最后,GROUP根据图像数据编码的思想构建一个用于表示工作负载组行为的三维输入张量。我们使用h×w×d来表示三维张量的大小。假设对于每个工作负载特征,我们选择与预测容器最高相关性的三个容器,通过特征串联可以获得一个大小为4×4×sw的输入张量,其中高度h为4,表示每个工作负载特征的不同容器数量,宽度w为4,表示不同工作负载特征的数量,深度d为sw,表示每个工作负载特征序列的长度。值得注意的是,GROUP还采用了一些特征对齐操作,以减少模型生成的难度。根据不同序列之间的相关方向确定是否需要翻转序列,根据不同序列之间的相关时间滞后确定是否需要平移序列。
对于每个采样尺度的输入张量,GROUP首先分析工作负载组行为的内部演化,以使预测模型能够识别和挖掘预测容器的工作负载变化如何受到工作负载组行为的内部演化的影响。
作为一种著名的深度前馈神经网络,CNN已广泛用于提取图像的局部特征。受Inception架构的启发,如图5所示,我们设计了一个四路卷积层用于提取与每个工作负载特征对应的不同容器序列的局部交互特征。由于原始输入张量的大小为4×4×sw,对于每个工作负载特征,我们使用三种尺度的滤波器,包括2×2、3×3和4×4。每个卷积层包含两层。通过组合不同的滤波器尺寸,可以将每个工作负载特征的不同容器的局部子序列视为找到工作负载组行为的内部演化关系。
此外,我们还直接应用单变量卷积的输出作为另一种卷积形式。值得注意的是,我们对每个卷积层使用相同的填充,并在每个卷积层后应用ReLU激活函数;这将产生四个大小相同的三维张量,大小为4×4×sw。我们在高度h方向上将所有张量进行串联,以获得一个大小为16×4×sw的张量,以保持每个卷积层方式的唯一特征。最后,我们将使用平均池化层在高度h方向上压缩特征张量。对于单一预测任务,输出张量的大小为1×4×sw,表示工作负载组行为的内部演化分析结果。
我们通过双向门控循环单元网络(BiGRU)[3]实现工作负载组行为的时间演化分析。GRU通过向RNN中添加更新门和重置门来克服RNN的局限性,以减少长期存储能力和计算损失的梯度扩散。更新门()确定在当前预测中保留多少先前信息,重置门()控制应忽略多少历史信息。
其中σ是具有输出值介于0和1之间的sigmoid激活函数,是时间步骤t的输入矩阵,是上一个时间步骤(t-1)的隐藏状态,和是更新门的权重和偏差矩阵,和是重置门的权重和偏差矩阵。
然而,GRU 只能从正向方向提取信息,而忽略了来自反向时间序列数据的有价值信息。因此,提出了 BiGRU[3],它由一个前向 GRU 和一个后向 GRU 组成,有效挖掘时间序列的正向和反向依赖关系。具体来说,如图 6 所示,对于当前模块输入张量中的每个工作负载特征序列,使用两层 BiGRU 网络生成大小为 1×1×m 的工作负载序列,用于 m 个未来时间步长。最后,通过基于每个特征的未来工作负载序列的特征串联获得大小为 1 × 4 × m 的输出张量。
我们采用四路卷积提取对应于不同特征的工作负载组行为之间的演化关系,即数据序列、趋势序列、季节性序列和残差序列中的任意两个、三个和四个序列。如图 7 所示,我们使用三种尺度的过滤器,包括 2×2、3×3 和 4×4。同样,我们直接使用单变量卷积的输出作为另一种形式的卷积。我们还在每个卷积层上使用相同的填充,并在每个卷积层之后应用 ReLU 激活函数。由于本步骤的工作负载只有四个固定特征,因此每个卷积层的方式仅包括一层。每个卷积层可以获得大小为 1 × 4 × m 的输出张量。此外,我们通过权重 w 方向中的特征串联实现了四种卷积方式的输出张量的拼接。接下来,通过平均池化层将特征图压缩为大小为 1×1×m 的张量。
基于每个采样尺度的内部、时间和多特征演化分析,我们将能够获得三个大小为 1×1×m 的输出张量,它们是 GROUP 提取的宏观、中观和微观工作负载变化对应的输出特征。然后,如图 8 所示,GROUP 通过宽度 w 方向上的特征串联获得大小为 1×3×m 的特征张量。然后,全连接层提取相关性并压缩特征张量。此外,我们在全连接层之前应用 Dropout 层,以防止模型过度拟合。最后,获得下一个 m 个时间步长的最终预测结果,这是通过分析三个工作负载变化尺度之间的演化关系获得的融合结果。
我们采用 RMSE 函数作为损失函数,如下式所示:
其中,z 是所有预测时间步数, 是时间步 t 的观测值,而 是时间步 t 的估计值。使用自适应矩估计优化算法(ADAM)[13]将 GROUP 模型训练为最小化损失函数的训练目标,初始学习率为 10^ −4,结合了自适应学习率梯度下降和动量梯度下降的优点。
1) 公共数据集 [29] 是基于 Kubernetes 系统在 30 天内收集的容器资源工作负载数据。它被分为十个文件,包括五种服务。每种服务类型包含两个容器;2) 阿里巴巴于 2021 年发布的集群跟踪数据集[18]提供了从生产集群中收集的容器历史工作负载数据,共计 12 小时。
我们使用 MAE(平均绝对误差)和 RMSE(均方根误差)指标评估 GROUP 模型的性能。为了有效地展示不同方法之间的准确度差异,一旦我们获得每个测试方法的 MAE 和 RMSE 结果,就将所有结果相对于在相应指标上表现最差的方法的结果进行归一化,以获得相对差异。
1) RNN[8]:仅考虑工作负载数据中的时间相关性的预测方法;2) GRU[22]:仅考虑工作负载数据中的时间相关性的预测方法;3) VMD-BiGRU-ED[17]:基于时间序列分解的多特征预测方法;4) DBiLSTM[24]:具有考虑组行为的双向 LSTM 预测方法;5) DBiGRU:基于 BiGRU 的 DBiLSTM 变体。为了公平比较,每个时间网络采用两层结构,每层有 128 个隐藏层神经元。
(1) 测试 1:验证 GROUP 在不同高级预测时间步骤下的行为。我们选择基于数据集 [29] 的五个不同服务容器作为预测容器。然后,使用与每个预测容器相同服务类型的另一个容器作为相关容器。我们使用包括 3、5 和 7 在内的三种高级时间步长来预测每个预测容器的 CPU 工作负载。
(2) 测试 2:验证 GROUP 在不同数量的相关容器下的行为。我们根据数据集 [18] 随机选择一个服务容器作为预测容器。然后,通过我们的容器相关计算算法获取与预测容器对应于每个工作负载特征的多个相关容器。我们使用包括 1、2、3、4、5 和 6 的六个相关容器数量来预测每个预测容器的 CPU 工作负载。 其他详细的实验信息在附录中。
图9展示了每种测试方法在不同预测时间步骤下的归一化结果。具体而言,有几个值得分析的实验现象。首先,GROUP在不同的预测时间步骤下都实现了最佳的预测结果。对于MAE和RMSE指标来说,相比其他所有方法,GROUP的改进平均为2.40%至24.89%和2.39%至23.50%。其次,VMD-BiGRU-ED方法实现了比RNN/GRU更好的预测准确性,反映出考虑工作负载的多特征变化的有效性。然而,VMD-BiGRU-ED的准确性仍然有限,因为它只关注所预测容器的单个工作负载变化,忽略了不同容器之间的工作负载演化关系。第三,DBiGRU/DBiLSTM方法实现了比RNN/GRU更好的预测准确性,反映出考虑工作负载组行为演化的有效性。然而,DBiGRU/DBiLSTM的准确性也有限,因为它只关注工作负载组行为的时间演化,缺乏有效的特征处理操作。基于上述现象,GROUP通过明确分析工作负载组行为的演化与每个容器工作负载变化之间的复杂关系,提供了稳健的预测准确性。这证明了我们在特征优化表示和模型优化设计方面的努力是有效的。
图10展示了在不同数量的相关容器下的GROUP的归一化结果。如图10所示,一方面,GROUP始终提供最佳的预测准确性,而具有两个相关容器的GROUP具有最大的准确性改进,这证明了GROUP能够有效描绘不同数量的相关容器下工作负载组行为演化与每个容器工作负载变化之间的复杂关系,因此具有很高的鲁棒性;另一方面,随着新的相关容器的工作负载序列被添加到输入特征图中,输入特征的复杂性随之增加,同时可能涉及的相关信息也会增加,从而影响模型的准确性。因此,这证明了工作负载组行为的表达是必要的。所提出的容器相关性计算算法可以指导相关容器的选择。然而,相关容器的数量也会影响模型的准确性和复杂性。因此,需要考虑确定适当的相关容器数量。通过从一个相关容器开始逐步测试,当准确性降低或超出置信区间时,即为最优或接近最优的数量。
所提出的GROUP模型主要适用于微服务架构下的容器应用,因为容器之间的多副本和多实例关系导致了工作负载的相关性,生成了工作负载组行为。当然,经过简单改进后,GROUP也可以应用于服务器或虚拟机的工作负载预测,因为它们通常运行相关的应用程序或作业,产生可重复和相关的业务行为。然而,与容器应用相比,它相对较弱。
本文侧重于云原生应用的工作负载预测问题。据我们所知,我们是第一个系统地对工作负载组行为进行建模,并明确地将其用于云原生应用的工作负载预测。此外,我们提出了一种容器相关性计算算法来表示工作负载组行为,并提出了一种端到端的多步预测模型,明确描绘了工作负载组行为的演化与每个容器工作负载变化之间的复杂关系。最后,在公开可用的数据集上进行了充分的测试,展示了我们的GROUP方法相对于其他最先进方法的性能优势。