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

项目地址:Datamining_project: 数据挖掘实战项目代码
目录
一、背景和挖掘目标
1、问题背景
2、传统方法的不足
2、原始数据
3、挖掘目标
二、分析方法与过程
1、初步分析
2、总体流程
第一步:数据抽取
第二步:探索分析
第三步:数据的预处理
3、构造容量预测模型
三、总结和思考
一、背景和挖掘目标
1、问题背景
- 应用系统的负载率:通过对一段时间内软硬件性能的运行状况进行综合评分而获得。
- 负载率趋势:通过系统的当前负载率与历史平均负载率进行比较。
2、传统方法的不足
- 磁盘容量的情况没有提供预测的功能。只有当容量将要被耗尽时,会有告警提示。如果是告警服务器的磁盘容量被耗尽,此种情况下,系统即使出现故障,也不会有告警提示。
- 不能提前知道系统负载的程度,只有当系统故障时,通过接受告警才得知。并且当系统真正故障的时,告警的发出大多数情况下会有一定的延迟。
2、原始数据
- 性能属性说明:针对采集的性能信息,对每个属性进行相应说明。

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

3、挖掘目标
- 针对历史磁盘数据,采用数据挖掘的方法,预测应用系统服务器磁盘已使用空间大小;
- 根据用户需求设置不同的预警等级,将预测值与容量值进行比较,对其结果进行预警判断,为系统管理员提供定制化的预警提示;
二、分析方法与过程
1、初步分析
- 应用系统出现故障通常不是突然瘫痪造成的(除非对服务器直接断电),而是一个渐变的过程。例如系统长时间运行,数据会持续写入存储,存储空间逐渐变少,最终磁盘被写满而导致系统故障。
- 在不考虑人为因素的影响时,存储空间随时间变化存在很强的关联性,且历史数据对未来的发展存在一定的影响,故可采用时间序列分析法对磁盘已使用空间进行预测分析。
2、总体流程

第一步:数据抽取
磁盘使用情况的数据都存放在性能数据中,而监控采集的性能数据中存在大量的其他属性数据。故以属性的标识号(TARGET_ID)与采集指标的时间(COLLECTTIME)为条件,对性能数据进行抽取。
第二步:探索分析
对数据进行周期性分析,探索数据的平稳性。

C盘和D盘的使用的大小。
# -*- coding:utf-8 -*-
import pandas as pd
import matplotlib.pyplot as pltdata = 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()
第三步:数据的预处理
数据清洗:实际业务中,监控系统会每天定时对磁盘的信息进行收集,但是磁盘容量属性一般情况下都是一个定值(不考虑中途扩容的情况),因此磁盘原始数据中会存在磁盘容量的重复数据。
- 剔除磁盘容量的重复数据。
- 将所有服务器的磁盘容量作为一个固定值,方便模型预警时需要。
属性构造:因每台服务器的磁盘信息可以通过表中NAME,TARGET_ID,ENTITY三个属性进行区分,且每台服务器的上述三个属性值是不变的,所以可以将三个属性的值进行合并。 (实质是将行转换成列)。

# -*-coding: utf-8-*-
import pandas as pddef 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 resultdiscfile = '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统计量检验方法。
- 模型识别:通过AIC、BIC信息准则或者观测自相关图和偏自相关图确定P、Q的参数,识别其模型属于AR、MA和ARMA中的哪一种模型。
- 参数估计:估计模型的其他参数。可以采用极大似然估计、条件最小二乘法确定。
- 模型检验:检测模型残差序列是否属于白噪声序列。

# -*- coding:utf-8 -*-
import pandas as pddef stationarityTest():'''平稳性检验:return:'''discfile = 'data/discdata_processed.xls'predictnum = 5data = pd.read_excel(discfile)data = data.iloc[: len(data) - predictnum]# 平稳性检验from statsmodels.tsa.stattools import adfuller as ADFdiff = 0adf = ADF(data['CWXT_DB:184:D:\\'])while adf[1] > 0.05:diff = diff + 1adf = 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/10pmax = 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 = 12data = 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() # maermse_ = ((abs_ ** 2).mean()) ** 0.5mape_ = (abs_ / data[u'实际值']).mean()print(u'平均绝对误差为:%0.4f,\n均方根误差为:%0.4f,\n平均绝对百分误差为:%0.6f。' % (mae_, rmse_, mape_))stationarityTest()
whitenoiseTest()
findOptimalpq()
arimaModelCheck()
calErrors()
模型预测:应用模型进行预测,获取未来5天的预测值。为了方便比较,将单位换算成GB。

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

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

三、总结和思考
- 监控不仅能够获取软硬件的性能数据,同时也能检测到软硬件的日志事件,并通过告警的方式提示用户。因此管理员在维护系统的过程中,特别关注应用系统类别的告警。一旦系统发生故障,则会影响整个公司的运作。但是在监控收集性能以及事件的过程中,会存在各类型告警误告情况。(注:应用系统发生误告时系统实际处于正常阶段)
- 根据历史每天的各种类型的告警数,通过相关性进行检验判断哪些类型告警与应用系统真正故障有关。通过相关类型的告警,预测明后两天的告警数。针对历史的告警数与应用系统的关系,判断系统未来是否发生故障。
- 可通过时序算法预测未来相关类型的告警数,然后采用分类预测算法对预测值进行判断,判断系统未来是否发生故障。
相关文章:
【数据挖掘实战】——应用系统负载分析与容量预测(ARIMA模型)
项目地址:Datamining_project: 数据挖掘实战项目代码 目录 一、背景和挖掘目标 1、问题背景 2、传统方法的不足 2、原始数据 3、挖掘目标 二、分析方法与过程 1、初步分析 2、总体流程 第一步:数据抽取 第二步:探索分析 第三步&a…...
【华为OD机试模拟题】用 C++ 实现 - 九宫格按键输入(2023.Q1)
最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明九宫格按键输入题目输入输出示例一输入输出说明示例二输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高…...
Linux: config: CONFIG_SYN_COOKIES
文章目录 CONFIG_SYN_COOKIESLinux kernel里的超时设置Huawei SBC详细工作机制CONFIG_SYN_COOKIES config SYN_COOKIES,布尔值;是否支持IP:TCP syncookie功能。 详解:一般来说TCP/IP网络不能够阻挡SYN flooding工具。这个工具很容易被利用,而且会导致DOS工具,妨碍其他整…...
【笔记】C# 数据类型转换
文章目录前言类型转换的概念1,隐式转换2,显式转换3,程序类转换结语前言 🌻 大家好啊,我是writer桑,本章是关于 C# 数据类型转换的一个总结,其中包含隐式、显示转换和程序类转换,方便…...
JavaWeb JavaBean,MVC三层架构
9、JavaBean 实体类 JavaBean有特定的写法: 必须要有一个无参构造属性必须私有化必须有对应的get/set方法; 一般用来和数据库的字段做映射 ORM; ORM :对象关系映射 表—>类字段–>属性行记录---->对象 people表 …...
JavaEE简单实例——MyBatis一对多关联映射的嵌套结果集查询
简单介绍: 在之前的章节,我们简单介绍了MyBatis中的一对一的关联查询,使用了嵌套查询和嵌套结果集两种方式进行讲解,但是在实际的使用中,我们常用的是嵌套结果集的查询方式,所以在一对多的查询中ÿ…...
大数据框架之Hadoop:MapReduce(三)MapReduce框架原理——OutputFormat数据输出
3.6.1OutputFormat接口实现类 OutputFormat是MapReduce输出的基类,所有实现MapReduce输出都实现了OutputFormat接口。下面我们介绍几种常见的OutputFormat实现类。 1、文本输出TextOutputFormat 默认的输出格式是TextOutputFormat,它把每条记录写为文…...
Linux搜索、编辑
目录 1.搜索 1.1.基础用法 1.2.高级用法 2.编辑 2.1.vim简洁 2.2.vim快捷键 1.搜索 1.1.基础用法 find命令用于搜索,格式如下: find 指定目录 -匹配方式 所要匹配的关键字 所要匹配的关键字支持通配符,?代表一个字符*代表任意个字符。 如果想设…...
Git Commit提交规范总结
文章目录前言git commit 提交规范提交消息头(commit message header)提交消息具体内容(commit message body)提交消息尾述(commit message footer)Revert表情(Emojis)标识idea插件其他操作Commitizen生成 Change logGit获取提交消息格式化输出相关参考前言 我们都知道…...
【ESP 保姆级教程】疯狂毕设篇 —— 案例:基于ESP8266和EMQX的教室灯光控制系统
忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-02-26 ❤️❤️ 本篇更新记录 2022-02-26 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请…...
SpringBoot (一) 项目构建、配置读取、静态资源定义
哈喽,大家好,我是有勇气的牛排(全网同名)🐮 有问题的小伙伴欢迎在文末评论,点赞、收藏是对我最大的支持!!!。 前言 SpringBoot是基于Spring开发的开源项目,…...
<JVM上篇:内存与垃圾回收篇>12 - 垃圾回收相关概念
笔记来源:尚硅谷 JVM 全套教程,百万播放,全网巅峰(宋红康详解 java 虚拟机) 文章目录12.1. System.gc()的理解12.2. 内存溢出与内存泄露内存溢出(OOM)内存泄漏(Memory Leakÿ…...
new操作符做了什么?
new是什么? new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。 function Person (name,age) {this.name namethis.age age } Person.prototype.sayName function () {console.log(this.name) } let man new Person(xl,20) consol…...
Java_IO流,书城IO版
1.字符IO流的输入/输出 首先,IO流根据多方面划分。 根据方向划分 输入流/输出流根据处理单元划分 字节流/字符流根据功能划分 节点流/处理流 尝试一下使用字符输入流在读写文件: package IOStream;import java.io.*;public class Test {public stati…...
2023自动化测试岗位需求的 7 项必备技能 (最新版)
目录:导读 一、自动化测试员技能——编程语言 二、自动化测试员技能–出色的手动测试技能 三、.自动化测试员技能–自动化工具专业知识 四、自动化测试员技能–了解业务需求 五、自动化测试员技能–自动化工具故障排除 六、自动化测试员技能–具有测试管理工具…...
【华为OD机试模拟题】用 C++ 实现 - 路灯照明(2023.Q1)
最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明路灯照明【华为OD机试模拟题】题目输入输出描述示例一输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高…...
学到贫血之-贫血模型和充血模型
学习自:设计模式之美 1 基于贫血模型的传统开发模式 // ControllerVO(View Object) public class UserController {private UserService userService; //通过构造函数或者IOC框架注入public UserVo getUserById(Long userId) {UserBo userBo userService.getUser…...
Java常用组件面试题
文章目录HTTP通信协议Kafka消息队列Linux操作系统Mybatis框架SpringCloud框架HTTP通信协议 https通信过程 https协议是指对通过http协议传输数据的进行加密和解密。当客户端发送https请求时,服务端会返回数字证书给客户端,客户端验证通过后会生成随机数…...
MySQL常见问题的解决方法
目录 cmd没有管理员权限 没有my.ini这个文件 ERROR 1045 (28000): Access denied for user ODBClocalhost (using password: NO) ERROR 1045 (28000): Access denied for user rootlocalhost (using password: NO) 其他常见问题 cmd没有管理员权限 cmd一定要用管理员权限打…...
全网详细介绍nginx的反向代理、正向代理配置,location的指令说明,反向代理的两个示例代码以及全局块,events块和http快的说明。
文章目录1. 文章引言2. 何谓反向代理3. 解析nginx的配置文件3.1 全局块(global block)3.2 events块(events block)3.3 http块(http block)4. 如何配置反向代理4.1 反向代理示例14.2 反向代理示例25. 补充说明5.1 location指令说明5.2 nginx完整配置文件1. 文章引言 如果你的服务…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
