Python 全栈系列263 简易资源监控

说明

开始比等待强

这块其实我也不太熟,而且我也知道应该有更专业的做法

在这里插入图片描述
其实连grafana我都准备好了,prometheus的镜像也准备好了,但是还没时间去细细弄。

我想先快快整一版够用的(能让我依据这个数据进行调度)就行。

内容

这事简单分为:

  • 1 抓取
  • 2 存储
  • 3 调用

1 抓取

抓取系统资源的包用psutil,我试了一下,还可以。

在这里插入图片描述

抓取cpu负载的函数,这个函数实际上会堵塞,观察过去一段时间的平均负载

import psutil

# pip3 install psutil -i https://mirrors.aliyun.com/pypi/simple/
# psutil.cpu_percent(interval=1) 函数会等待一秒钟,然后返回这段时间内的平均 CPU 使用率。interval 参数指定等待的时间间隔,单位是秒。
def get_cpu_usage(interval = 1):
    """
    获取详细的 CPU 使用率信息,并以字典形式返回。

    Returns:
        dict: 包含各个 CPU 时间百分比的详细信息。
    """
    cpu_times_percent = psutil.cpu_times_percent(interval=interval)
    cpu_usage_dict = {
        "user": cpu_times_percent.user,
        "system": cpu_times_percent.system,
        "idle": cpu_times_percent.idle}
    return cpu_usage_dict

In [2]: get_cpu_usage(5)
Out[2]: {'user': 67.0, 'system': 11.2, 'idle': 21.5}

抓取内存的占用,这个是即时的

import psutil

def get_memory_usage(unit="GB"):
    # 获取系统的内存使用情况
    memory_info = psutil.virtual_memory()

    # 定义转换因子
    conversion_factors = {
        "B": 1,
        "KB": 1024,
        "MB": 1024 * 1024,
        "GB": 1024 * 1024 * 1024
    }

    # 获取转换因子
    factor = conversion_factors.get(unit.upper(), 1)

    # 计算内存使用情况
    total_memory = memory_info.total / factor
    available_memory = memory_info.available / factor
    used_memory = memory_info.used / factor
    memory_usage_percentage = memory_info.percent

    # 返回结果
    return {
        "total_memory": round(total_memory,2),
        "avail_memory": round(available_memory,2),
        "used_memory": round(used_memory,2),
        "usage_pct": round(memory_usage_percentage,2)
    }

In [4]: get_memory_usage()
Out[4]:
{'total_memory': 125.77,
 'avail_memory': 100.61,
 'used_memory': 23.98,
 'usage_pct': 20.0}

2 存储

假设以5秒为周期进行统计,那么操作数据库的频次其实很低。所以使用默认的mysql(24013)完全可以胜任。使用ORM操作是很理想的。

数据库:mydb(默认)
表:system_resource_log

以下建立数据对像:

from sqlalchemy import create_engine, Column, Integer, String, Float, DateTime, func, Text, Index
from sqlalchemy.orm import sessionmaker,declarative_base
from datetime import datetime


m7_24013_url = f"mysql+pymysql://xxx:xxx@172.17.0.1:24013/mydb"

# from urllib.parse import quote_plus
# the_passed = quote_plus('!@#*')
# # 创建数据库引擎
m7_engine = create_engine(m7_24013_url)

# 创建基类
Base = declarative_base()

# 定义数据模型
class SystemResourceLog(Base):
    __tablename__ = 'system_resource_log'
    id = Column(Integer, primary_key=True)
    # CompileError: (in table 'users', column 'name'): VARCHAR requires a length on dialect mysql
    cpu_user_usage = Column(Float(precision=2))
    cpu_system_usage = Column(Float(precision=2))
    cpu_idle_usage = Column(Float(precision=2))
    
    memory_total = Column(Float(precision=2))
    memory_used = Column(Float(precision=2))
    memory_avail = Column(Float(precision=2))
    memory_used_pct = Column(Float(precision=2))

    create_time = Column(DateTime, default=lambda: datetime.now())

    # 创建索引
    __table_args__ = (
        Index('idx_create_time', create_time),
    )

# 创建表
# Base.metadata.drop_all(m7_engine)
Base.metadata.create_all(m7_engine)

执行一次,进行对象映射

cpu_usage_dict  = get_cpu_usage(5)
memory_usage_dict = get_memory_usage()

srl = SystemResourceLog()
srl.cpu_user_usage = cpu_usage_dict['user']
srl.cpu_system_usage = cpu_usage_dict['system']
srl.cpu_idle_usage = cpu_usage_dict['idle']

srl.memory_total = memory_usage_dict['total_memory']
srl.memory_used = memory_usage_dict['used_memory']
srl.memory_avail = memory_usage_dict['avail_memory']
srl.memory_used_pct = memory_usage_dict['usage_pct']

with Session() as session:
    # 添加新用户
    session.add(srl)
    session.commit()

在这里插入图片描述

3 调用

使用aps,进入执行态。

from datetime import datetime
import os 
from apscheduler.schedulers.blocking import BlockingScheduler

def exe_sh(cmd = None):
    os.system(cmd)

# 后台启动命令 nohup python3 aps.py >/dev/null 2>&1 &

if __name__ == '__main__':
    sche1 = BlockingScheduler()
    # sche1.add_job(exe_sh,'interval', seconds=1, kwargs ={'cmd':'python3 ./main_handler/main.py'})
    sche1.add_job(exe_sh,'interval', seconds=5, 
    kwargs ={'cmd':'python3 psutil_monitor_worker.py'},
    max_instances=1,coalesce=True)
    print('[S] starting inteverl')
    sche1.start()

切到目录下面,然后执行aps就可以了

nohup python3 aps.py >/dev/null 2>&1 &

ps: nohup启动并不那么靠谱,最好还是systemd 或者 docker启动。

it works.
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值