system: [SYSTEM]

user: 3. 云换境下动态故障检测实验架构 本章节设计实验来提高云计算平台系统的可靠性。实验部分分为真实环境模拟、数据采集、数据处理、以及贝叶斯分类器训练四个模块。 3.1. 真实环境模拟 由于贝叶斯EM算法属于无监督学习算法，且在本文计算方法中用于计算数据点属于正常生成数据的概率，因此能否生成合理、全面的数据集是实验的首要工作。为了模拟真实运行的情况，本文采取虚拟机(ubuntu)的形式搭建了基于Hadoop的云平台来采集实验数据，搭建的Hadoop集群下有3个节点，包含一个Master节点和两个Slave节点，三个节点的具体配置完全相同。虚拟表配置如表1所示(注：虚拟内存不设置限制以满足较大数据的计算需求)。 Table 1 Node configuratio 项目 配置 CPU Intel Core i7 2.2 GHz 内存 4096 MB 硬盘 30 GB 操作系统 Ubuntu 18.0 表1. 节点配置 我们采用Hibench大数据基准测试套件来测试该集群的运行情况，该套件可用于测试Hadoop环境下的运行速度、吞吐量和资源利用率，我们使用其来模拟真实环境下程序的运行状况。其主要工作负载包括排序、词频计数、TearSort、重分区等。表2中详细列出了本次实验使用的workload模版以及其主要功能。 Table 2 System resulting data of standard experimen 测试项目 主要功能 Sort 使用RandomTextWriter生成随机数据，然后该功能负责将这些数据进行排序 WordCount 使用RandomTextWriter生成随机数据，然后该功能负责统计其中出现的词频数目 TeraSort 使用Hadoop TeraGen程序生成数据，然后执行TeraSort算法对数据进行排序 Enhanced DFSIO 同时执行写入程序和读取程序，测试Hadoop平台吞吐量 Bayesian Classification 使用zipfian分布的文档进行贝叶斯分类器训练 K-means clustering 使用GenKMeansDataset生成基于高斯分布的输入数据，进行K-means聚类 Logistic Regression 输入数据使用基于随机平衡决策树的Logistic Regression Data Generator生成，执行线性回归工作 Principal Components Analysis 输入数据通过PCADataGenerator生成，执行主成分分析工作 Support Vector Machine 输入数据通过SVMDataGenerator生成，之后执行支持向量机分类工作 PageRank 输入数据通过爬取网页数据后，执行PageRank算法 NWeight 执行Nweight算法 SQL Scan， Join & Aggreagte 数据通过爬取网页数据，执行过程基于文献 [ 17 ] 表2. 标准试验系统结果数据 列表中的操作覆盖了大量的计算机经典算法，涉及到CPU、磁盘、网络、内存等重要计算机资源，为了模拟真实环境下的运行结果，我们执行三个数量级下的操作(以WordCount为例)：Small (3，200，000/bytes)级别、Large (320，000，000/byte)级别、Huge(3，200，000，000 ca/byte)级别。 3.2. 实验数据采集 实验数据采集模块主要负责采集云计算平台性能数据(CPU、IO、内存、网络等)。本文采用Sysstat进行数据收集，每分钟采集82个性能指标的数据，Sysstat是监测系统性能和效率的一组工具，如CPU占比、网络吞吐数据等。其主要工具和作用如表3所示： Table 3 Sysstat tooltabl 工具 具体作用 iostat 监视输入输出，输出磁盘吞吐效率的数据和CPU使用率 mpstat 提供一个cpu或若干cpu相关数据 pidstat 关于runtime的进程/任务、CPU、内存等信息 sar 工具负责报告、采集和存储系统信息 sa1 负责记录、存储系统动态数据并存储到二进制的文件中。通过cron来运行，它是为sadc专门设计的前端程序 sa2 负责整理系统活跃信息，将信息总结后写入报告 sadc 收集系统动态数据，存储到二进制文件中 表3. Sysstat工具表 经Sysstat收集但未经处理的数据指标共250个，其中主要指标的意义如表4所示： Table 4 Indicators for collecting dat 采集类型 采集指标 指标描述 CPU usr 用户处理级别下的CPU利用率 system 系统级别下CPU利用率 idle CPU空闲时间百分比 iowait 当存在未完成的磁盘I/O请求时，描述CPU或CPU处于空闲状态的时间 IO PROC/s 每秒创建的进程总数 Tps 传输给物理磁盘的请求 Bread/s 设备中读取的总数据量 Wtps 设备中写入的总数据量 Rtps 每秒发送的读请求总数 Memused 内存使用百分比 Bufpg/s 每秒系统用作缓冲区的额外内存页数。负值表示系统用作缓冲区的页面数减少 Mem Campg/s 每秒由系统缓存的额外内存页的数目。负值表示缓存中的页面更少 KBMEMFREE 空闲内存(单位为千字节) KBMEMFUSED 占据内存(单位为千字节) KBBUFFERS 内核用作缓冲区的内存量(单位为千字节) KBCHACED 内核用作缓存的内存量(单位为千字节) KBSWAPFREE 空闲交换空间(单位为千字节) KBSWAPUSED 占据的交换空间(单位为千字节) KBSWPCAD 缓存的交换内存(单位为千字节)的数量，这是曾经被换出、被换回但仍然在交换区域中的内存(如果需要内存，则不需要再次交换，因为它已经在交换区域中了) Network %swapused 使用交换空间的百分比 %memused 使用内存的百分比 PxPCK/s 每秒接收的包数 RxBYT/s 每秒接收的字节数 TxBYT/s 每秒传输的字节数 RxCMP/s 每秒接收的压缩包数(用于cslip等) Coll/s 传输数据包时每秒发生的冲突数 TCPSCK 目前正在使用的TCP sockets数量 RAWSCK 目前正在使用的RAW sockets数量 RxFIFO/s 每秒传输的包数 表4. 采集数据指标 3.3. 数据预处理 大型数据中心和云系统可能有数百甚至数千个特征，它可以是系统或用户级别的CPU利用率、CPU空闲时间、内存利用率、I/O操作等等。大量的性能指标通常会使数据模型变得极其复杂，因此我们需要提取数据特征来减少数据之间的相关性、降低数据之间的冗余并移除无用的数据。考虑到程序的执行时间，在非监督学习下处理数据冗余以及相关性的方法我们采取了互信息和PCA (Principal components analysis)的方法。 3.3.1. 互信息(Mutual Information) 图1. CPU和内存的特征对之间的互信息 云环境下的故障检测通常会采集很多不同类型的性能数据，这就会导致特征的维度很高。而在无监督 学习的情况下，高维度的特征会导致特征彼此之间的区别性降低，同时高度相似的特征也会阻碍无监督学习中分组和表征数据的性能，我们可以通过使用互信息来评估特征之间的相似性。在下面的讨论中，我们用 X 1 ， X 2 ， ⋯ ， X n 来表示不同特征的离散随机变量，那么两个特征的相互信息定义如下： I ( X i ， X j ) = ∑ x i ∑ x j p ( x i ， x j ) log p ( x i ， x j ) p ( x i ) p ( x j ) (1) 它量化特征 X i 和特征 X j 之间共享的信息量。 I ( X i ， X j ) 可以从全局上度量两个特征之间的相关性。具有高相关性的特征对之间具有大量的相互信息，如果 X i 和 X j 是独立的，则这两个特征之间的互信息取到了最小值0；如果 X i 和 X j 是同一特征，则它们之间的互信息取到了最大值1。使用互信息的目的是减少所选特征子集之间的相关性，因此当一个特征和其它特征之间的互信息值很大的时候，就应该考虑将该特征从特征集中去除。在本文中，我们将相关性评估的指标定义如下： I n d e x ( X i ) = ∑ j = 1 i − 1 I ( X i ， X j ) + ∑ j = i + 1 n I ( X i ， X j ) (2) 可以证明，具有线性关系的两个特征之间具有较高的Index值，这两个特征之间表现出明显的相关性。图1中列出了CPU统计类别中每对特征根据上述公式计算出的互信息值，根据图中互信息的大小，最终我们挑选出%user、%system、%idle、kbbbuffer、pgpgout/s、fault/s、rxpck/s、txpck/s和tps这八个特征值。 3.3.2. PCA (Principle Component Analysis) 在对特征进行选择时，仅仅从特征集中挑选出相互独立的特征子集是远远不够的，特征之间的冗余会带来很多问题。主成分分析方法是应用最为广泛的降维算法之一。它的主要思想是将n维特征映射到k维上，映射出来的k维特征相互正交，我们将其称之为主成分。本文中我们使用特征值分解协方差矩阵实现PCA算法，假设特征集合 X = { x 1 ， x 2 ， x 3 ， ⋯ ， x n } 需要降维到k维，其算法流程如下所示： 1.对所有的样本进行中心化，即对每个样本数据执行 x i = x i − 1 m ∑ j = 1 m x j 操作； 2.计算样本的协方差数据 C = 1 M X X T ； 3.求出协方差矩阵的特征值及对应的特征向量； 4.将特征向量按对应特征值大小从上到下按行排列成矩阵，并取前k行组成矩阵P； 5.令 Y = P X ，则Y即为降维后的数据； 图2. 使用PCA算法进行降维 然后我们用PCA算法来减少上述8个特征之间的冗余，图2为使用PCA算法对八个特征进行降维的效果，我们可以看到，降维后前两个主成分贡献了原数据94.37%的信息量，因此我们可以进一步将维度减少到二维。 3.4. 分类器训练模块 为了检测可能的故障，我们分析采集的性能数据并基于它构建统计模型。对于一个经过降维处理的数据点d，我们为其选择一个概率模型f，它以数据点d作为输入，并输出该数据点为健康数据的概率，其中f的参数以无监督学习的方式从训练数据中学习。当设置阀值为t时，对于任一数据点 d i ，若 f ( d i ) < t ，则认为 d i 属于故障数据或不常出现于正常数据中。这种构建模型的思想本质上是认为当一个数据点出现在健康数据中的概率较低时，此数据点应该被定义为错误数据或者异常数据。 3.4.1. 贝叶斯子模型集合算法推导 为了构建此概率模型并确保较高的检测精度，我们采用贝叶斯子模型集合算法来处理这类多态分布问题。每个子模型均为非参数数据模型，我们也没有假设单个参数的概率密度，而是根据其在训练数据中的频率计数来确定其概率分布，每个子模型都有一个预估的先验概率 p ( m ) ，其中m是指每个子模型的索引值，则数据点d的概率可以视为： p ( d ) = ∑ m ∈ s u b m o d e l s p ( d | m ) ∗ p ( m ) (3) 其中 p ( d | m ) 为子模型m生成数据点d的概率。 由于子模型概率分布是通过统计训练数据在子模型中的分布计数而来，由此我们可以得到子模型的概率计算公式如下： p ( m ) = c o u n t ( m ) ∑ m ∈ s u b m o d e l s c o u n t ( m ) (4) 其中， c o u n t ( m ) 代表满足条件的数据点的数量，其数学表达式为： c o u n t ( m ) = ∑ d ∈ t r a i n s e t p ( m | d ) (5) 概率 p ( m | d ) 代表数据点d分配给子模型m的概率。式(3)中右半部分中 p ( m ) 可以通过式(4)计算得出，下面我们推导 p ( d | m ) 的数学表达式。在之前的性能数据处理模块中，我们通过数据预处理和特征提取得到了数据点d相互独立且其分布属于离散区间的k个特征，因此可以得出 p ( d | m ) 的数学表达式： p ( d | m ) = ∏ i = 1 k p ( d i | m ) (6) 由于我们使用的是贝叶斯离散模型，可知 d i 值属于有限范围内，假设 d i 值为v，则 p ( d i | m ) 的计算方式如式(7)所示： p ( d i = v | m ) = c o u n t ( d i = v and m ) c o u n t ( m ) (7) 其中 c o u n t ( d i = v and m ) 可以由下面的公式计算得出： c o u n t ( d i = v and m ) = ∑ d ∈ t r a i n s e t p ( m | d ) ∗ I ( d i ， v ) (8) 在这里 I ( d i ， v ) 的定义如下所示： I ( d i ， v ) = { 1 ，         d i = v 0 ，     d i ≠ v (9) 3.4.2. 贝叶斯子模型集合算法步骤 为了训练该模型，我们首先需要先决定子模型的数量，受到数据处理模块中特征选择的启发，我们选择了四个子模块。 贝叶斯子模型集合算法的具体步骤如下： 1.初始化参数数据：随机分配数据点给子模型，分配过程中初始化 p ( m ) 与 p ( d i | m ) ； 2.E步：确定子模型数据的条件概率，也就是 p ( m ) 和 p ( d i | m ) ，然后再根据式(6)计算得到 p ( d i | m ) ，再根据公式(3)计算出 p ( d ) 。这样E步就能够计算出每个数据点的概率 p ( d ) ，从而进一步由式(10)计算出子模型m生成数据点d的概率，即 p ( m | d ) 。 p ( m | d ) = p ( d | m ) ∗ p ( m ) p ( d ) (10) 其中 p ( d | m ) 、 p ( m ) 、 p ( d ) 均已计算出。 3.M步：E步完成之后，M步依照 p ( m | d ) 得到数据的分布情况，并根据公式(7)与式(4)更新 p ( d i | m ) 与 p ( m ) 。这样即遵照了期望值重新计算了分布情况，又使期望值最大化。 4.迭代：反复执行E、M步直到 p ( m | d ) 收敛。 迭代完成后，对于任意需要验证是否为错误数据的数据点d，假设其k个特征值为： d = ( d 1 = v 1 ， d 2 = v 2 ， d 3 = v 3 ， ⋯ ， d k = v k ) (11) 则由正常数据生成的概率 f ( d ) 的计算公式如下所示： f ( d ) = ∑ m ∈ s u b m o d e l s p ( m ) ∗ ∏ i = 1 k p ( d i = v i ， m ) (12) 假设阈值为t，则数据点d是否为健康数据就可以由下式(3.16)判断： d = { error     if   f ( d ) < t healthy     if   f ( d ) ≥ t (13)