TH小破站

  • 首页
  • 容器
    • 认识Docker
    • DockerFile详解
  • k8s
    • 认识Kubernetes
    • Kubernetes部署--(kubeadm方式)
    • kubeasz部署k8s集群
    • Ansible-binary部署k8s集群-1.31.2
  • Ceph
    • 认识分布式存储
    • CPEH部署
  • CI/CD
    • DevOps认识
    • 部署--Gitlab
  • ELK
    • ELK简介
    • Elasticsearch
    • Kibana部署
    • Logstash
    • ELK--收集 tomcat 日志(实战)
  • HD
    • 认识--大数据
    • Hadoop-单机部署
    • Hadoop-伪分布部署
    • Hadoop-完全分布部署
    • Hadoop-(HA)完全分布部署
    • Ambari自动部署--Hadoop
  • Nginx
    • Nginx功能介绍
    • Nginx安全选项
    • Nginx配置文件简单介绍
    • 网站服务器部署
  • 监控
    • ZABBIX-部署(yum)
    • ZABBIX-编译安装
  • 云计算
    • KVM 概述
    • OpenStack企业级部署(T版)
    • OpenStack之dashboard部署
    • OpenStack-controller的高可用
    • openstack(Caracal版_ubuntu版本)部署
  • 数据库
    • mariadb与mysql
    • mysql主从
    • MySQL--冷备(实战)
    • MySQL--热备(dump表)
    • MySQL--热备(dump库)
    • 数据恢复实战案例
    • Xtrabackup实现MySql8.x全量备份
    • MyCat实现数据库读写分离
    • MHA实现数据库高可用
    • Percona XtraDB(PXC)实现数据库集群高可用
    • 数据库压力测试
    • PostgreSQL 基操
    • PostgreSQL备份恢复
    • PostgreSQL高可用
    • MongDB安装配置基础使用
    • MongoDB实现复制集
    • MongoDB备份还原
  • 自动化
    • ssh远程服务原理及配置
    • Ansible剧本文件应用
    • Ansible管理服务介绍
    • Ansible自动化部署node_exporter(包含升级,回滚)
    • Saltstack-部署安装
  • 脚本
    • 一键查看服务器资源利用率
    • 一键生成SSL证书
    • 保存指定数量的文件/目录
    • 初始化服务器
    • 扫描可用IP
    • 批量分发SSH密钥
    • 监控多主机磁盘脚本
    • 一键安装MySQL8.x脚本
    • Python脚本监控ES集群
    • 资源巡检脚本
    • 查看各用户使用的cpu占比
热衷于分享
架构师成长之路 !!!
  1. 首页
  2. 机器学习
  3. 正文

基于机器学习--预测处理运维问题(磁盘)

2026年1月11日 728点热度 0人点赞 0条评论

背景:

  • 运维复杂性增加,传统响应式运维成本高、效率低。

  • 数据驱动的运维(AIOps)成为趋势,机器学习是实现智能预测的核心。

目标:

  • 构建预测模型,提前发现潜在故障、性能瓶颈或资源需求。

  • 实现从“被动响应”到“主动预防”的运维模式转变,提升系统稳定性与资源利用率。

运维磁盘预测

python 脚本

 import asyncio
 import aiohttp
 import time
 import numpy as np
 from typing import Dict, List
 from dataclasses import dataclass
 ​
 # ================= 配置区域 =================
 VM_URL = "http://192.168.100.130:8428"   # VictoriaMetrics 地址
 LOOKBACK_WINDOW = "5m"                  # 历史数据窗口,支持 s/m/h/d
 PREDICT_WINDOW_HOURS = 1                 # 预测未来多久 按天计算
 THRESHOLD_PERCENT = 80                   # 告警阈值 %
 STEP = "15s"                             # 数据步长
 ​
 ​
 # ================= 数据类 =================
 @dataclass
 class DiskMetric:
     instance: str
     device: str
     mountpoint: str
     total_bytes: float
     history_timestamps: np.ndarray
     history_values: np.ndarray
 ​
 ​
 # ================= 核心类 =================
 class DiskPredictor:
     def __init__(self, vm_url: str):
         self.vm_url = vm_url
         self.query_range_url = f"{vm_url}/api/v1/query_range"
         self.query_url = f"{vm_url}/api/v1/query"
 ​
     async def fetch_json(self, session: aiohttp.ClientSession, url: str, params: Dict) -> Dict:
         async with session.get(url, params=params) as response:
             if response.status != 200:
                 print(f"Error fetching data: {response.status}")
                 return {}
             return await response.json()
 ​
     @staticmethod
     def parse_duration(duration: str) -> int:
         """将 Prometheus 风格时间字符串转换为秒"""
         unit_map = {"s": 1, "m": 60, "h": 3600, "d": 86400}
         unit = duration[-1]
         value = int(duration[:-1])
         if unit not in unit_map:
             raise ValueError(f"Unsupported duration unit: {unit}")
         return value * unit_map[unit]
 ​
     async def get_data(self):
         """
         并行获取两组数据:
         1. 磁盘总大小 (Instant Query)
         2. 磁盘剩余空间历史趋势 (Range Query)
         """
         now = int(time.time())
         lookback_seconds = self.parse_duration(LOOKBACK_WINDOW)
         start = now - lookback_seconds
 ​
         q_total = 'node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}'
         q_free_history = 'node_filesystem_free_bytes{fstype!~"tmpfs|overlay"}'
 ​
         async with aiohttp.ClientSession() as session:
             task_total = self.fetch_json(session, self.query_url, {'query': q_total})
             task_history = self.fetch_json(session, self.query_range_url, {
                 'query': q_free_history,
                 'start': start,
                 'end': now,
                 'step': STEP
             })
             return await asyncio.gather(task_total, task_history)
 ​
     def parse_and_merge(self, res_total: Dict, res_history: Dict) -> List[DiskMetric]:
         """将总大小和历史趋势数据合并"""
         disks = {}
         # 解析总大小
         if 'data' in res_total and 'result' in res_total['data']:
             for item in res_total['data']['result']:
                 m = item['metric']
                 key = f"{m.get('instance')}|{m.get('device')}|{m.get('mountpoint')}"
                 disks[key] = {'meta': m, 'total': float(item['value'][1]), 'history': None}
 ​
         # 解析历史数据并合并
         metrics_list = []
         if 'data' in res_history and 'result' in res_history['data']:
             for item in res_history['data']['result']:
                 m = item['metric']
                 key = f"{m.get('instance')}|{m.get('device')}|{m.get('mountpoint')}"
                 if key in disks and disks[key]['total'] > 0:
                     values = np.array(item['values'], dtype=float)
                     metric_obj = DiskMetric(
                         instance=m.get('instance'),
                         device=m.get('device'),
                         mountpoint=m.get('mountpoint'),
                         total_bytes=disks[key]['total'],
                         history_timestamps=values[:, 0],
                         history_values=values[:, 1]
                     )
                     metrics_list.append(metric_obj)
         return metrics_list
 ​
     def predict_and_alert(self, metrics: List[DiskMetric]):
         """线性回归预测未来磁盘使用率,并打印告警"""
         print(f"Analyzed {len(metrics)} disk devices across infrastructure.")
         print(f"{'Instance':<30} {'Mount':<10} {'Curr Usage%':<12} {'Pred Usage%':<15} {'Status'}")
         print("-" * 85)
 ​
         for m in metrics:
             if len(m.history_timestamps) < 2:
                 continue  # 数据点不足,无法预测
 ​
             x = m.history_timestamps - m.history_timestamps[0]  # 时间归一化
             y = m.history_values  # free bytes
 ​
             # 线性回归
             slope, intercept = np.polyfit(x, y, deg=1)
 ​
             # 预测未来
             current_offset = x[-1]
             future_offset = current_offset + (PREDICT_WINDOW_HOURS * 3600)
             predicted_free_bytes = max(0, slope * future_offset + intercept)
 ​
             current_free = y[-1]
             curr_usage_pct = (1 - (current_free / m.total_bytes)) * 100
             pred_usage_pct = (1 - (predicted_free_bytes / m.total_bytes)) * 100
 ​
             status = "🔴 ALERT" if pred_usage_pct >= THRESHOLD_PERCENT else "🟢 OK"
             print(f"{m.instance:<30} {m.mountpoint:<10} {curr_usage_pct:>6.2f}%      {pred_usage_pct:>6.2f}%         {status}")
 ​
 ​
 # ================= 执行逻辑 =================
 async def main():
     predictor = DiskPredictor(vm_url=VM_URL)
     res_total, res_history = await predictor.get_data()
 ​
     if not res_total or not res_history:
         print("Failed to fetch data from VictoriaMetrics")
         return
 ​
     metrics = predictor.parse_and_merge(res_total, res_history)
     predictor.predict_and_alert(metrics)
 ​
 ​
 if __name__ == "__main__":
     try:
         asyncio.run(main())
     except KeyboardInterrupt:
         pass

结果

 Analyzed 6 disk devices across infrastructure.
 Instance                       Mount      Curr Usage%  Pred Usage%     Status
 -------------------------------------------------------------------------------------
 192.168.100.130:9100           /           37.13%       37.16%         🟢 OK
 192.168.100.131:9100           /           76.60%      100.00%         🔴 ALERT
 192.168.100.132:9100           /           33.13%       33.13%         🟢 OK
 192.168.100.130:9100           /boot        9.86%        9.86%         🟢 OK
 192.168.100.131:9100           /boot        9.86%        9.86%         🟢 OK
 192.168.100.132:9100           /boot        9.86%        9.86%         🟢 OK
标签: 暂无
最后更新:2026年1月11日

tanghao946

这个人很懒,什么都没留下

点赞

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复
文章目录
  • 背景:
  • 目标:
  • 运维磁盘预测
    • python 脚本

COPYRIGHT © 2025 TH小破站. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

渝ICP备2023013789号

渝公网安备50011702500926号