如何用 Python 监控系统状态?
这个周末花了点时间看了 Python 。自动化运维是 Python 一个比较擅长点,查看相关资料。 但是我有点疑惑的地方:
比方说系统监控,有 20 台机器。 各自在本地运行个 python 脚本,然后有一台收集数据的机器,提供一个 http 接口口,接受这二十台数据传来的各自系统的性能数据。 在这台机器上去写一个展示层。
1.思路是否是这样的? 2.通常这些数据都是通过 psutil 这个模块提供的数据。除了这些点还应该关注哪些点? 3.展示层有哪些好用的框架? 4.每台机器上的都需要跑这个 py 脚本。但是如果机器更多的话,难道需要一个个的拷贝上去吗?
如何用 Python 监控系统状态?
- 大体上差不多
2. 不清楚
3. 现在似乎 Grafana 比较火,应该还有不少同类工具
4. ansible, puppet 和各种类似物,最不济还可以 scp
另外楼主可以了解一下主流监控系统比如 nagios, zabbix 甚至 new relic 这些商业解决方案,可以帮助理解 1. 的问题;还有 nagios-plugins (独立 fork 版叫 monitoring-plugins), collectd 之类的更接近你说的 2. 这种东东;前面这些并不局限于 Python
要监控系统状态,Python有几个很棒的库。最常用的是psutil,它能获取CPU、内存、磁盘、网络和进程信息。另一个是GPUtil,专门看GPU状态。
下面是一个基础示例,展示如何使用psutil获取关键指标:
import psutil
import time
def get_system_status():
"""获取并打印系统状态信息"""
# 1. CPU信息
cpu_percent = psutil.cpu_percent(interval=1) # 1秒内的CPU使用率
cpu_count = psutil.cpu_count(logical=True) # 逻辑CPU核心数
# 2. 内存信息
mem = psutil.virtual_memory()
mem_total = mem.total / (1024**3) # 转换为GB
mem_used = mem.used / (1024**3)
mem_percent = mem.percent
# 3. 磁盘信息
disk = psutil.disk_usage('/')
disk_total = disk.total / (1024**3)
disk_used = disk.used / (1024**3)
disk_percent = disk.percent
# 4. 网络信息(发送/接收的字节数)
net_io = psutil.net_io_counters()
bytes_sent = net_io.bytes_sent / (1024**2) # 转换为MB
bytes_recv = net_io.bytes_recv / (1024**2)
# 打印结果
print(f"CPU使用率: {cpu_percent}% ({cpu_count}核心)")
print(f"内存: {mem_used:.1f}GB / {mem_total:.1f}GB ({mem_percent}%)")
print(f"磁盘: {disk_used:.1f}GB / {disk_total:.1f}GB ({disk_percent}%)")
print(f"网络: 发送 {bytes_sent:.1f}MB, 接收 {bytes_recv:.1f}MB")
print("-" * 40)
# 持续监控,每5秒更新一次
if __name__ == "__main__":
try:
while True:
get_system_status()
time.sleep(5)
except KeyboardInterrupt:
print("\n监控已停止")
安装方法:
pip install psutil
如果你想监控GPU(如果有NVIDIA显卡):
import GPUtil
gpus = GPUtil.getGPUs()
for gpu in gpus:
print(f"GPU {gpu.id}: {gpu.name}")
print(f" 显存使用: {gpu.memoryUsed}MB / {gpu.memoryTotal}MB")
print(f" 负载: {gpu.load*100:.1f}%")
这个方案足够监控大部分系统状态,psutil的文档很全,需要其他信息时查文档就行。
总结:用psutil做基础监控,需要GPU信息再加GPUtil。
4 如果是云环境,比如 aws 或者阿里云,有创建磁盘 image 的功能,直接把这些脚本放到 root image 里.
“比方说系统监控, 1234 ”,轮子非常大,有现成的系统,别人很多年了,比如 zabbix 。
SaltStack
zabbix+定制监控脚本
你需要 pm2
prometheus 用于接收 http 接口传来的数据,开箱即用, gafanna 用于数据展示。
zabbix 采集数据,用 Grafana 来做数据展示,想同时安装部署一个服务到很多个节点可以考虑 puppet 之类的
Graphite+StatsD+Grafana+Diamond
- saltstack
2. telegraf , influxdb, grafana (TICK/ELK)
3. zeromq , psutils, python


