说明
开始比等待强
这块其实我也不太熟,而且我也知道应该有更专业的做法
其实连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.