【数据挖掘实战】——应用系统负载分析与容量预测(ARIMA模型)

news2024/11/24 0:07:02

在这里插入图片描述

项目地址:Datamining_project: 数据挖掘实战项目代码

目录

一、背景和挖掘目标

 1、问题背景

2、传统方法的不足

2、原始数据

3、挖掘目标 

二、分析方法与过程

1、初步分析

2、总体流程

第一步:数据抽取

第二步:探索分析

第三步:数据的预处理

3、构造容量预测模型

三、总结和思考


一、背景和挖掘目标

 1、问题背景

应用系统是由服务器、数据库、中间件、存储设备等组成。它在日常运行时,会对底层软硬件造成负荷。其中任何一种资源负载过大,都可能会引起应用系统性能下降甚至瘫痪。及时了解当前应用系统的负载情况,以便提前预防,确保系统安全稳定运行。
  • 应用系统的负载率:通过对一段时间内软硬件性能的运行状况进行综合评分而获得。
  • 负载率趋势:通过系统的当前负载率与历史平均负载率进行比较。
应用系统的负载高或者负载趋势大的现象,代表系统目前处于高危工作环境中。如果系统管理员不及时进行相应的处理,系统很容易出现故障。
本例重点分析磁盘容量,如果应用系统出现存储容量耗尽的情况,会导致应用系统负载率过高,最终引发故障。

2、传统方法的不足

系统负载分析的传统方法:通过监控采集到的性能数据以及所发出的告警事件,人为进行判断系统的负载情况。此方法虽然能够判断系统故障以及磁盘的容量情况,但是存在一些缺陷和不足:
  • 磁盘容量的情况没有提供预测的功能。只有当容量将要被耗尽时,会有告警提示。如果是告警服务器的磁盘容量被耗尽,此种情况下,系统即使出现故障,也不会有告警提示。
  • 不能提前知道系统负载的程度,只有当系统故障时,通过接受告警才得知。并且当系统真正故障的时,告警的发出大多数情况下会有一定的延迟。

2、原始数据

  • 性能属性说明:针对采集的性能信息,对每个属性进行相应说明。

  • 磁盘数据:包含应用系统、磁盘基本信息等。

3、挖掘目标 

  • 针对历史磁盘数据,采用数据挖掘的方法,预测应用系统服务器磁盘已使用空间大小;
  • 根据用户需求设置不同的预警等级,将预测值与容量值进行比较,对其结果进行预警判断,为系统管理员提供定制化的预警提示;

二、分析方法与过程

1、初步分析

  • 应用系统出现故障通常不是突然瘫痪造成的(除非对服务器直接断电),而是一个渐变的过程。例如系统长时间运行,数据会持续写入存储,存储空间逐渐变少,最终磁盘被写满而导致系统故障。
  • 在不考虑人为因素的影响时,存储空间随时间变化存在很强的关联性,且历史数据对未来的发展存在一定的影响,故可采用时间序列分析法对磁盘已使用空间进行预测分析。

2、总体流程

第一步:数据抽取

磁盘使用情况的数据都存放在性能数据中,而监控采集的性能数据中存在大量的其他属性数据。故以属性的标识号(TARGET_ID)与采集指标的时间(COLLECTTIME)为条件,对性能数据进行抽取。

抽取10-01至11-16财务管理系统中某一台数据库服务器的磁盘的相关数据。

第二步:探索分析

对数据进行周期性分析,探索数据的平稳性。

C盘和D盘的使用的大小。 

# -*- coding:utf-8 -*-
import pandas as pd
import matplotlib.pyplot as plt


data = pd.read_excel('data/discdata.xls')
str1 = 'C:\\'
str2 = 'D:\\'
dataC = data[(data['DESCRIPTION'] == '磁盘已使用大小') & (data['ENTITY'] == str1)]
dataD = data[(data['DESCRIPTION'] == '磁盘已使用大小') & (data['ENTITY'] == str2)]
dataC.plot(y='VALUE')
dataD.plot(y='VALUE')
plt.show()

第三步:数据的预处理

数据清洗:实际业务中,监控系统会每天定时对磁盘的信息进行收集,但是磁盘容量属性一般情况下都是一个定值(不考虑中途扩容的情况),因此磁盘原始数据中会存在磁盘容量的重复数据。

  • 剔除磁盘容量的重复数据。
  • 将所有服务器的磁盘容量作为一个固定值,方便模型预警时需要。

属性构造:因每台服务器的磁盘信息可以通过表中NAMETARGET_IDENTITY三个属性进行区分,且每台服务器的上述三个属性值是不变的,所以可以将三个属性的值进行合并。 (实质是将行转换成列)。

# -*-coding: utf-8-*-
import pandas as pd


def attr_trans(x):
    result = pd.Series(index=['SYS_NAME', 'CWXT_DB:184:C:\\', 'CWXT_DB:184:D:\\', 'COLLECTTIME'])
    result['SYS_NAME'] = x['SYS_NAME'].iloc[0]
    result['COLLECTTIME'] = x['COLLECTTIME'].iloc[0]
    result['CWXT_DB:184:C:\\'] = x['VALUE'].iloc[0]
    result['CWXT_DB:184:D:\\'] = x['VALUE'].iloc[1]
    return result


discfile = 'data/discdata.xls'
transformeddata = 'data/discdata_processed.xls'
data = pd.read_excel(discfile)
data = data[data['TARGET_ID'] == 184].copy()
# 按时间分组
data_group = data.groupby('COLLECTTIME')
data_processed = data_group.apply(attr_trans)
data_processed.to_excel(transformeddata, index=False)

3、构造容量预测模型

  • 平稳性检验:为了确定原始数据序列中没有随机趋势或趋势,需要对数据进行平稳性检验,否则将会产生“伪回归”的现象。方法:单位跟检验或者观察时序图。
  • 白噪声检验:为了验证序列中有用的信息是否已被提取完毕,需要对序列进行白噪声检验。如果序列检验为白噪声序列,就说明序列中有用的信息已经被提取完毕了,剩下的全是随机扰动,无法进行预测和使用。方法:一般采用LB统计量检验方法。
  • 模型识别:通过AICBIC信息准则或者观测自相关图和偏自相关图确定PQ的参数,识别其模型属于ARMAARMA中的哪一种模型。
  • 参数估计:估计模型的其他参数。可以采用极大似然估计、条件最小二乘法确定。
  • 模型检验:检测模型残差序列是否属于白噪声序列。

# -*- coding:utf-8 -*-
import pandas as pd


def stationarityTest():
    '''
    平稳性检验
    :return:
    '''
    discfile = 'data/discdata_processed.xls'
    predictnum = 5

    data = pd.read_excel(discfile)
    data = data.iloc[: len(data) - predictnum]
    # 平稳性检验
    from statsmodels.tsa.stattools import adfuller as ADF
    diff = 0
    adf = ADF(data['CWXT_DB:184:D:\\'])
    while adf[1] > 0.05:
        diff = diff + 1
        adf = ADF(data['CWXT_DB:184:D:\\'].diff(diff).dropna())

    print(u'原始序列经过%s阶差分后归于平稳,p值为%s' % (diff, adf[1]))


def whitenoiseTest():
    '''
    白噪声检验
    :return:
    '''
    discfile = 'data/discdata_processed.xls'
    data = pd.read_excel(discfile)
    data = data.iloc[: len(data) - 5]
    # 白噪声检验
    from statsmodels.stats.diagnostic import acorr_ljungbox
    [[lb], [p]] = acorr_ljungbox(data['CWXT_DB:184:D:\\'], lags=1)
    if p < 0.05:
        print(u'原始序列为非白噪声序列,对应的p值为:%s' % p)
    else:
        print(u'原始该序列为白噪声序列,对应的p值为:%s' % p)
    [[lb], [p]] = acorr_ljungbox(data['CWXT_DB:184:D:\\'].diff().dropna(), lags=1)
    if p < 0.05:
        print(u'一阶差分序列为非白噪声序列,对应的p值为:%s' % p)
    else:
        print(u'一阶差分该序列为白噪声序列,对应的p值为:%s' % p)


def findOptimalpq():
    '''
    得到模型参数
    :return:
    '''
    discfile = 'data/discdata_processed.xls'
    data = pd.read_excel(discfile, index_col='COLLECTTIME')
    data = data.iloc[: len(data) - 5]
    xdata = data['CWXT_DB:184:D:\\']

    from statsmodels.tsa.arima_model import ARIMA

    # 定阶
    # 一般阶数不超过length/10
    pmax = int(len(xdata) / 10)
    qmax = int(len(xdata) / 10)
    # bic矩阵
    bic_matrix = []
    for p in range(pmax + 1):
        tmp = []
        for q in range(qmax + 1):
            try:
                tmp.append(ARIMA(xdata, (p, 1, q)).fit().bic)
            except:
                tmp.append(None)
        bic_matrix.append(tmp)

    bic_matrix = pd.DataFrame(bic_matrix)
    # 先用stack展平,然后用idxmin找出最小值位置。
    p, q = bic_matrix.stack().astype('float64').idxmin()
    print(u'BIC最小的p值和q值为:%s、%s' % (p, q))


def arimaModelCheck():
    '''
    模型检验
    :return:
    '''
    discfile = 'data/discdata_processed.xls'
    # 残差延迟个数
    lagnum = 12

    data = pd.read_excel(discfile, index_col='COLLECTTIME')
    data = data.iloc[: len(data) - 5]
    xdata = data['CWXT_DB:184:D:\\']
    # 建立ARIMA(0,1,1)模型
    from statsmodels.tsa.arima_model import ARIMA
    # 建立并训练模型
    arima = ARIMA(xdata, (0, 1, 1)).fit()
    # 预测
    xdata_pred = arima.predict(typ='levels')
    # 计算残差
    pred_error = (xdata_pred - xdata).dropna()

    from statsmodels.stats.diagnostic import acorr_ljungbox
    # 白噪声检验
    lb, p = acorr_ljungbox(pred_error, lags=lagnum)
    # p值小于0.05,认为是非白噪声。
    h = (p < 0.05).sum()
    if h > 0:
        print(u'模型ARIMA(0,1,1)不符合白噪声检验')
    else:
        print(u'模型ARIMA(0,1,1)符合白噪声检验')


def calErrors():
    '''
    误差计算
    :return:
    '''
    # 参数初始化
    file = 'data/predictdata.xls'
    data = pd.read_excel(file)

    # 计算误差
    abs_ = (data[u'预测值'] - data[u'实际值']).abs()
    mae_ = abs_.mean()  # mae
    rmse_ = ((abs_ ** 2).mean()) ** 0.5
    mape_ = (abs_ / data[u'实际值']).mean()

    print(u'平均绝对误差为:%0.4f,\n均方根误差为:%0.4f,\n平均绝对百分误差为:%0.6f。' % (mae_, rmse_, mape_))


stationarityTest()
whitenoiseTest()
findOptimalpq()
arimaModelCheck()
calErrors()

模型预测:应用模型进行预测,获取未来5天的预测值。为了方便比较,将单位换算成GB

模型评价:

采用三个衡量模型预测精度的统计量指标:平均绝对误差、均方根误差、平均绝对百分误差,从不同侧面反映了算法的预测精度。

模型应用:

  • 计算预测使用率:根据模型预测得到的值,计算预测使用率。
  • 设定预警等级:根据业务应用一般设置的阈值,也可以根据管理员要求进行相应的调整。
  • 发布预警信息

三、总结和思考

  • 监控不仅能够获取软硬件的性能数据,同时也能检测到软硬件的日志事件,并通过告警的方式提示用户。因此管理员在维护系统的过程中,特别关注应用系统类别的告警。一旦系统发生故障,则会影响整个公司的运作。但是在监控收集性能以及事件的过程中,会存在各类型告警误告情况。(注:应用系统发生误告时系统实际处于正常阶段)
  • 根据历史每天的各种类型的告警数,通过相关性进行检验判断哪些类型告警与应用系统真正故障有关。通过相关类型的告警,预测明后两天的告警数。针对历史的告警数与应用系统的关系,判断系统未来是否发生故障。
  • 可通过时序算法预测未来相关类型的告警数,然后采用分类预测算法对预测值进行判断,判断系统未来是否发生故障。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/374180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【华为OD机试模拟题】用 C++ 实现 - 内存池(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明内存池题目输入输出示例一输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:…

C++【string类用法详细介绍string类模拟实现解析】

文章目录string 类用法介绍及模拟实现一、string介绍二、string类常用接口1. string类对象的常见构造接口2.string类对象的常见容量接口3.string类对象的常见修改接口4. string类对象的常见访问及遍历接口5.string其他接口1.不常用查找接口2.字符替换3.字符串拼接4.字符串排序5…

纯x86汇编实现的多线程操作系统实践 - 第三章 BSP的守护执行

本章我们将详细讲解BSP剩下的执行代码&#xff0c;它们被安排在bp_32.asm文件中。bp_32.asm主要完成以下功能&#xff1a;系统中断初始化加载字符图形数据到内存区域将AP的启动代码和32位保护模式下的代码分别加载到内存中显示主界面以及系统启动信息向所有AP群发启动命令进入守…

linux 解压.gz文件 报错 gzip:stdin:not in gzip format(已解决)

目录 1、问题&#xff1a; 2、分析原因 3、解决办法 1、问题&#xff1a; 在解压一个以【.gz】&#xff08;注意不是.tar.gz&#xff09;结尾的压缩包时&#xff0c;遇到报错 【gzip&#xff1a;stdin&#xff1a;不是gzip格式】 翻译一下问题&#xff1a;【gzip&#xff1a;st…

纯x86汇编实现的多线程操作系统实践 - 第一章 系统整体结构说明

现代CPU都是多核系统&#xff0c;拥有多个执行内核&#xff08;即计算引擎&#xff09;&#xff0c;可并发执行不同的代码。在CPU众多的执行内核中&#xff0c;有一个为主执行内核&#xff08;BSP&#xff09;&#xff0c;在CPU上电后&#xff0c;该主执行内核会率先启动&#…

lighthouse-自定义Gatherer与Audits

这篇文章是Lighthouse的后续&#xff0c;之前介绍了 lighthouse的介绍和基本使用方法 Lighthouse组合Puppeteer检测页面 这两篇文章&#xff0c;在这两篇文章中介绍了lighthouse的整体架构和基本运行的逻辑&#xff0c;lighthouse默认也采集了足够丰富的数据供我们去分析页面的…

都在用 AI 生成美少女,而我却。。。

最近 AI 画画特别的火&#xff0c;你能从网上看到非常多好看的图片&#xff0c;于是我就开始了我的安装之旅&#xff0c;我看到的图是这样的。这样的。还有这样的。然后我就开始了我的 AI 安装生成计划。安装环境首先我们需要安装 Python 环境&#xff0c;因为这个需要显卡&…

NCRE计算机等级考试Python真题(二)

第二套试题1、关于算法的描述&#xff0c;以下选项中错误的是A.算法具有可行性、确定性、有穷性的基本特征B.算法的复杂度主要包括时间复杂度和数据复杂度C.算法的基本要素包括数据对象的运算和操作及算法的控制结构D.算法是指解题方案的准确而完整的描述正确答案&#xff1a; …

Java基础之日志

2.日志 2.1概述【理解】 概述 程序中的日志可以用来记录程序在运行的时候点点滴滴。并可以进行永久存储。 日志与输出语句的区别 输出语句日志技术取消日志需要修改代码&#xff0c;灵活性比较差不需要修改代码&#xff0c;灵活性比较好输出位置只能是控制台可以将日志信息写…

用于C++的对象关系映射库—YB.ORM

1 介绍YB.ORM YB.ORM 旨在简化与关系数据库交互的 C 应用程序的开发。 对象关系映射器(ORM) 通过将数据库表映射到类并将表行映射到应用程序中的对象来工作&#xff0c;这种方法可能不是对每个数据库应用程序都是最佳的&#xff0c;但它被证明在需要复杂逻辑和事务处理的应用程…

不怕被AirTag跟踪?苹果Find My技术越来越普及

苹果的 AirTag 自推出以来&#xff0c;如何有效遏制用户用其进行非法跟踪&#xff0c;是摆在苹果面前的一大难题。一家为执法部门制造无线扫描设备的公司近日通过 KickStarter 平台&#xff0c;众筹了一款消费级产品&#xff0c;可帮助用户检测周围是否存在追踪的 AirTag 等设备…

Spring中的FactoryBean 和 BeanFactory、BeanPostProcessor 和BeanFactoryPostProcessor解析

文章目录FactoryBean 和 BeanFactory后置处理器BeanPostProcessor 和 BeanFactoryPostProcessorBeanPostProcessorBeanFactoryPostProcessorFactoryBean 和 BeanFactory BeanFactory接⼝是容器的顶级接⼝&#xff0c;定义了容器的⼀些基础⾏为&#xff0c;负责⽣产和管理Bean的…

python元编程详解

什么是元编程 软件开发中很重要的一条原则就是“不要重复自己的工作&#xff08;Don’t repeat youself&#xff09;”&#xff0c;也就是说当我们需要复制粘贴代码时候&#xff0c;通常都需要寻找一个更加优雅的解决方案&#xff0c;在python中&#xff0c;这类问题常常会归类…

C++015-C++函数

文章目录C015-C函数函数目标char[]和stringchar[]char*string字符常量与字符串常量字符串的输入题目描述 字符串输出题目描述在线练习&#xff1a;总结C015-C函数 在线练习&#xff1a; http://noi.openjudge.cn/ https://www.luogu.com.cn/ 函数 目标 函数是指一段可以直接被…

SVG实例详解系列(一)(svg概述、位图和矢量图区别(图解)、SVG应用实例)

SVG实例详解系列&#xff08;一&#xff09; (svg概述、位图和矢量图区别&#xff08;图解&#xff09;、SVG应用实例&#xff09; 目录 一、什么是SVG? &#xff08;1&#xff09;、位图和矢量图概念&#xff08;图解&#xff09; &#xff08;2&#xff09;、SVG的小例子…

Flutter入门进阶之旅 -开源Flutter项目

开源Flutter项目 该项目为纯flutter端项目&#xff0c;采用aar方式寄生在原生APP中&#xff0c;作为APP中的一个独立模块 在业务逻辑上做到与原生APP完全隔离&#xff0c;Flutter端开发者&#xff0c;可完全不用关注原生端的业务模块 两端开发彼此业务隔离&#xff0c;缩小了对…

数字IC手撕代码--小米科技(除法器设计)

前言&#xff1a; 本专栏旨在记录高频笔面试手撕代码题&#xff0c;以备数字前端秋招&#xff0c;本专栏所有文章提供原理分析、代码及波形&#xff0c;所有代码均经过本人验证。目录如下&#xff1a;1.数字IC手撕代码-分频器&#xff08;任意偶数分频&#xff09;2.数字IC手撕…

wondows10系统python2.7兼容安装python3.10

假设已安装好python2.7和pyhon3.10。 python命令只需要应用程序改名即可&#xff0c;需要修改的有python.exe和pythonw.exe pip命令麻烦点&#xff0c;需要用改名后的程序名 重新安装&#xff0c;命令如下&#xff1a; python3 -m pip install --upgrade pip --force-reinst…

说说 Pluma 插件管理框架

1. 概述 Pluma 是一个用 C 开发的可用于管理插件的开源架构&#xff0c;其官网地址为&#xff1a;http://pluma-framework.sourceforge.net/。该架构是个轻量级架构&#xff0c;非常易于理解。 Pluma 架构有以下基本概念&#xff1a; 1&#xff09;插件的外在行为体现为一个…

【C++的OpenCV】第七课-OpenCV图像常用操作(四):图像形态学-图像侵蚀和扩散的原理

让我们来深化前边学习的内容前言一、图像形态学是什么&#xff1f;二、侵蚀和扩张的原理2.1 图像的侵蚀2.1.1 概念2.1.2 原理解释2.2 图像的扩张2.2.1 概念2.2.2 原理解释相关链接&#xff1a;【C的OpenCV】第六课-OpenCV图像常用操作&#xff08;三&#xff09;&#xff1a;Op…