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

news2024/11/16 5:59:48

说明

开始比等待强

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

在这里插入图片描述
其实连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.
在这里插入图片描述

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

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

相关文章

高性能内存对象缓存

Memcached概述 一套开源的高性能分布式内存对象缓存系统 所有的数据都存储在内存中 支持任意存储类型的数据 提高网站的访问速度 数据存储方式与数据过期方式 数据存储方式:Slab Allocation 按组分配内存,每次先分配一个Slab,相当于一个大小为1M的页&…

技术革新!MultiDesk:高效远程桌面管理工具,TAB切换引领新潮流!

前言 话说远程操作,win系统自带的远程工具那可真是个让人头疼又爱不释手的活儿;不过别怕,今天小江湖要给大家揭秘一款神器——MultiDesk;有了它,可以不需要频繁切换窗口,不再为记不住复杂的服务器地址和密…

电脑监控怎样看回放视频?一键解锁电脑监控回放,守护安全不留死角!高效员工电脑监控,回放视频随时查!

你是否曾好奇那些键盘敲击背后的秘密?电脑监控不仅是守护企业安全的隐形盾牌,更是揭秘高效与合规的魔法镜!一键解锁安企神监控回放,就像打开时间宝盒,让过去的工作瞬间跃然眼前。无论是精彩瞬间还是潜在风险&#xff0…

go语言中数据接口set集合的实现

概述 set 是一种常用的数据结构,它表示一组唯一元素的集合。在不同的编程语言和库中,set 可能有不同的实现方式和特性。 set 集合数据结构具有以下特性: 唯一性:set 中的元素是唯一的,不允许重复。这意味着在 set 中…

Linux环境下OpenSSH升级到 OpenSSH_9.8p1(内置保姆级教程并包含openssl升级过程)

文章目录 前言一、下载openssh、openssl二进制包二、升级步骤1.系统开启telnet,防止意外导致shh无法连接2.确认升级前openssh的版本3.升级openssh3.1.备份旧ssh配置文件及目录3.2.备份旧ssh相关的二进制程序文件3.3.安装gcc,并解压9.8p1的安装包3.4.执行openssh编译…

超有性价比深度学习卡特斯拉 P100,16G大显存,Stable Diffusion AI 绘画利器

超有性价比深度学习卡特斯拉 P100,16G大显存,Stable Diffusion AI 绘画利器 在当今数字化创作的时代,AI 绘画技术正以惊人的速度发展,为艺术家和创作者们带来了全新的可能性。而要实现高效的 AI 绘画,一款性能卓越的显…

MySQL——基本概念、环境安装、分类、语法(增删改查)以及内置数据库与基本函数

目录 一、数据库的概念 二、数据库的分类 关系型数据库: 非关系型数据库: 三、数据库系统 四、安装数据库 配置数据库的环境变量 五、MySQL的登录命令 六、SQL DDL DML DQL DCL 七、创建数据库 八、增删改查数据库 增加数据 删除数据 逻…

进程间的通信2——有名管道、信号

通信方式:(1)单工://广播;单一方向的数据通道; (2)半双工://对讲机;同一时刻只能有一个方向; (3)全双工://手机电话;同一时…

Selenium 自动化测试平台

1.介绍 Selenium 是一套 Web网站 的程序自动化操作 解决方案。 通过它,我们可以写出自动化程序,像人一样在浏览器里操作web界面。 比如点击界面按钮,在文本框中输入文字 等操作。 而且还能从web界面获取信息。 比如获取 火车、汽车票务信息…

Spark2.x 入门:套接字流(DStream)

Spark Streaming可以通过Socket端口监听并接收数据,然后进行相应处理。 新建NetworkWordCount.scala代码文件,请在该文件中输入如下内容: package org.apache.spark.examples.streaming import org.apache.spark._ import org.apache.spark…

图像数据处理9

二、灰度变换 2.3 非线性灰度变换 以下式子中使用 f 表示输入图像的像素值&#xff0c;g 表示输出图像的像素值 2.3.1伽马校正&#xff08;Gamma Correction&#xff09; γ 是伽马值&#xff0c;通常大于0。调整 γ 的值可以改变图像的亮度。当 γ<1 时&#xff0c;图像…

一个简单的Rtmp推流客户端(QT录音,OpenCV摄像,FFmpeg编码推流)

RTMP&#xff08;Real-Time Messaging Protocol&#xff09;是一种实时流媒体传输协议&#xff0c;常用于音视频直播。 RTMP推流客户端是一种能够将音视频数据推送到直播服务器的工具。QT录音是利用Qt库实现的录音功能。OpenCV摄像是利用OpenCV库实现的对摄像头的控制和图像处理…

Chrome书签搜索插件

效果展示 这是一个chroma插件&#xff0c;可以按住 ctrl/command B 进行搜索您的书签&#xff0c;并且点击打开您的书签。支持上下切换回车打开新页面。支持文件夹搜索。多层级文件夹使用 / 分割。如&#xff1a;文件夹1/文件夹2/标签1 扩展下载地址 bookmark-search 欢迎有…

小程序学习day09-WXS脚本、自定义组件-组件的创建、引用、组件与页面的区别、组件的样式隔离

39、WXS脚本&#xff08;小程序独有的一套脚本语言&#xff09; &#xff08;1&#xff09;作用&#xff1a;结合WXML&#xff0c;可以构建出页面结构 &#xff08;2&#xff09;应用&#xff1a;在小程序中充当过滤器。&#xff08;wxml无法调用在页面的.js中定义的函数&…

DNS in Kubernetes

DNS in Kubernetes 对象分配的名称Service DNS 记录Pod DNS 记录 Cluster DNS参考 DNS for Services and Pods 这里主要讨论集群内不同对象之间的DNS解析 默认情况下&#xff0c;创建集群时&#xff0c;k8s会部署内置的DNS服务器&#xff0c;在集群内&#xff0c;我们不关注…

spring-boot-3.2.6+spring-security-6.2.4+oauth2整合github示例

一、添加依赖 在 pom.xml 中添加如下依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"h…

<数据集>航拍路面病害识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3151张 标注数量(xml文件个数)&#xff1a;3151 标注数量(txt文件个数)&#xff1a;3151 标注类别数&#xff1a;7 标注类别名称&#xff1a;[Longitudinal crack, Transverse crack, Alligator crack, Oblique cr…

腾讯 图标点选 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我…

Element UI中报dateObject.getTime is not a function解决方法~

1、错误信息。 2、该报错原因是Element UI中日期组件的校验规则是type: "date",而一般我们从后台拿到的数据是字符串型的&#xff0c;不满足预期&#xff0c;就会报错。 3、解决方法。 去掉日子组件中的type: "date"校验规则即可。 rules: {newName: [{…

SOMEIP_ETS_046: echoUTF16FIXED

测试目的&#xff1a; 验证设备&#xff08;DUT&#xff09;是否能够正确处理echoUTF16FIXED方法的参数&#xff0c;并确保发送和接收的参数顺序和值保持一致。 描述 本测试用例旨在检查DUT在接收到一个使用echoUTF16FIXED方法的SOME/IP消息时&#xff0c;是否能够按照请求中…