如何用 Python 监控系统状态?

这个周末花了点时间看了 Python 。自动化运维是 Python 一个比较擅长点,查看相关资料。 但是我有点疑惑的地方:

比方说系统监控,有 20 台机器。 各自在本地运行个 python 脚本,然后有一台收集数据的机器,提供一个 http 接口口,接受这二十台数据传来的各自系统的性能数据。 在这台机器上去写一个展示层。

1.思路是否是这样的? 2.通常这些数据都是通过 psutil 这个模块提供的数据。除了这些点还应该关注哪些点? 3.展示层有哪些好用的框架? 4.每台机器上的都需要跑这个 py 脚本。但是如果机器更多的话,难道需要一个个的拷贝上去吗?


如何用 Python 监控系统状态?

13 回复
  1. 大体上差不多
    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 。

zabbix+定制监控脚本

收集数据交给 zabbix ,展示层用 py 脚本和 zabbix 结合吧

你需要 pm2

prometheus 用于接收 http 接口传来的数据,开箱即用, gafanna 用于数据展示。

zabbix 采集数据,用 Grafana 来做数据展示,想同时安装部署一个服务到很多个节点可以考虑 puppet 之类的

Graphite+StatsD+Grafana+Diamond

  1. saltstack
    2. telegraf , influxdb, grafana (TICK/ELK)
    3. zeromq , psutils, python
回到顶部