logo

Python实现系统性能监控:基础参数获取与文件存储全攻略

作者:很酷cat2025.09.15 13:50浏览量:1

简介:本文详细介绍了如何使用Python获取系统基础性能参数(CPU、内存、磁盘、网络等),并通过代码示例演示如何将这些数据写入文件,适用于系统监控、性能分析等场景。

Python实现系统性能监控:基础参数获取与文件存储全攻略

在系统运维、性能调优或资源管理中,实时获取并记录系统基础性能参数是关键环节。Python凭借其丰富的标准库和第三方工具,能够高效完成这一任务。本文将系统阐述如何使用Python获取CPU、内存、磁盘、网络等基础性能参数,并将数据结构化写入文件,为开发者提供一套完整的解决方案。

一、核心工具与模块选择

Python生态中,psutil是系统性能监控的首选库。它跨平台(Windows/Linux/macOS),提供统一的API接口,支持获取CPU、内存、磁盘、网络、传感器等数十种参数。相较于手动调用系统命令(如topvmstat),psutil更简洁、安全,且无需处理不同操作系统的命令差异。

1.1 安装与基础使用

  1. pip install psutil

导入后,可直接调用函数获取参数:

  1. import psutil
  2. # 获取CPU使用率
  3. cpu_percent = psutil.cpu_percent(interval=1)
  4. print(f"CPU使用率: {cpu_percent}%")
  5. # 获取内存信息
  6. mem = psutil.virtual_memory()
  7. print(f"总内存: {mem.total / (1024**3):.2f}GB, 可用内存: {mem.available / (1024**3):.2f}GB")

二、关键性能参数获取与解析

2.1 CPU性能监控

  • 单核/多核使用率psutil.cpu_percent(interval=1, percpu=True)返回各核使用率列表。
  • 负载平均值:通过os.getloadavg()(Linux/macOS)或psutil.getloadavg()获取1/5/15分钟平均负载。
  • 上下文切换与中断:需结合/proc/stat(Linux)解析,但psutil未直接提供,可通过扩展实现。

示例:记录CPU多核数据

  1. cpu_percent_list = psutil.cpu_percent(interval=1, percpu=True)
  2. with open("cpu_log.csv", "a") as f:
  3. f.write(f"{time.time()},") # 时间戳
  4. f.write(",".join([f"{x:.2f}" for x in cpu_percent_list]) + "\n")

2.2 内存与交换分区监控

  • 物理内存psutil.virtual_memory()返回总内存、可用内存、使用率等。
  • 交换分区psutil.swap_memory()获取交换分区使用情况。
  • 缓存与缓冲:通过mem.cachedmem.buffers区分。

示例:内存快照写入JSON

  1. import json
  2. mem_info = {
  3. "total": psutil.virtual_memory().total,
  4. "available": psutil.virtual_memory().available,
  5. "used_percent": psutil.virtual_memory().percent,
  6. "swap_used": psutil.swap_memory().used
  7. }
  8. with open("mem_snapshot.json", "w") as f:
  9. json.dump(mem_info, f, indent=4)

2.3 磁盘I/O与分区监控

  • 磁盘使用率psutil.disk_usage('/')获取根分区使用情况。
  • I/O统计psutil.disk_io_counters()返回读写字节数、次数等。
  • 分区列表psutil.disk_partitions()列出所有磁盘分区。

示例:磁盘I/O实时监控

  1. disk_io = psutil.disk_io_counters()
  2. with open("disk_io.log", "a") as f:
  3. f.write(f"{time.time()},read_bytes:{disk_io.read_bytes},write_bytes:{disk_io.write_bytes}\n")

2.4 网络接口监控

  • 流量统计psutil.net_io_counters()获取总收发字节数。
  • 连接数psutil.net_connections()列出所有网络连接(需root权限)。
  • 接口信息psutil.net_if_addrs()获取网卡IP地址。

示例:网络流量差分计算

  1. old_io = psutil.net_io_counters()
  2. time.sleep(1)
  3. new_io = psutil.net_io_counters()
  4. bytes_sent = new_io.bytes_sent - old_io.bytes_sent
  5. bytes_recv = new_io.bytes_recv - old_io.bytes_recv
  6. with open("net_traffic.csv", "a") as f:
  7. f.write(f"{time.time()},sent:{bytes_sent},recv:{bytes_recv}\n")

三、数据存储与格式化

3.1 文件格式选择

  • CSV:适合结构化数据,易于用Excel或Pandas分析。
  • JSON:适合嵌套数据,便于程序解析。
  • SQLite:适合长期存储,支持SQL查询。

3.2 高效写入策略

  • 批量写入:避免频繁打开文件,可累积数据后一次性写入。
  • 时间戳:所有记录应包含时间戳,便于后续分析。
  • 异常处理:捕获文件操作异常,防止程序崩溃。

示例:综合监控脚本

  1. import psutil
  2. import time
  3. import csv
  4. from datetime import datetime
  5. def write_to_csv(data, filename):
  6. with open(filename, "a", newline="") as f:
  7. writer = csv.writer(f)
  8. if f.tell() == 0: # 文件为空时写入表头
  9. writer.writerow(["timestamp", "cpu_percent", "mem_percent", "disk_read", "disk_write", "net_sent", "net_recv"])
  10. writer.writerow(data)
  11. def monitor():
  12. while True:
  13. # 获取CPU使用率
  14. cpu_percent = psutil.cpu_percent(interval=1)
  15. # 获取内存使用率
  16. mem_percent = psutil.virtual_memory().percent
  17. # 获取磁盘I/O(差分)
  18. old_io = getattr(monitor, "old_disk_io", psutil.disk_io_counters())
  19. new_io = psutil.disk_io_counters()
  20. disk_read = new_io.read_bytes - old_io.read_bytes
  21. disk_write = new_io.write_bytes - old_io.write_bytes
  22. monitor.old_disk_io = new_io
  23. # 获取网络I/O(差分)
  24. old_net = getattr(monitor, "old_net_io", psutil.net_io_counters())
  25. new_net = psutil.net_io_counters()
  26. net_sent = new_net.bytes_sent - old_net.bytes_sent
  27. net_recv = new_net.bytes_recv - old_net.bytes_recv
  28. monitor.old_net_io = new_net
  29. # 写入CSV
  30. timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  31. data = [timestamp, cpu_percent, mem_percent, disk_read, disk_write, net_sent, net_recv]
  32. write_to_csv(data, "system_monitor.csv")
  33. time.sleep(1) # 每秒采集一次
  34. if __name__ == "__main__":
  35. monitor()

四、高级应用与优化

4.1 实时告警机制

结合阈值判断,当CPU使用率持续超过90%时,通过邮件或短信告警。可使用smtplib发送邮件,或集成第三方告警服务。

4.2 数据可视化

将CSV数据导入Pandas或Matplotlib,生成趋势图:

  1. import pandas as pd
  2. import matplotlib.pyplot as plt
  3. df = pd.read_csv("system_monitor.csv")
  4. df["timestamp"] = pd.to_datetime(df["timestamp"])
  5. df.set_index("timestamp").cpu_percent.plot(title="CPU使用率趋势")
  6. plt.show()

4.3 性能优化技巧

  • 采样频率:根据需求调整采样间隔(如1秒或5秒)。
  • 资源占用:避免在监控脚本中执行耗时操作。
  • 多线程:使用threading模块分离数据采集与写入操作。

五、总结与扩展

Python通过psutil库实现了跨平台的系统性能监控,结合文件存储可构建轻量级监控系统。开发者可根据实际需求扩展功能,如:

  • 集成Prometheus或InfluxDB实现时序数据库存储。
  • 开发Web界面实时展示监控数据。
  • 结合机器学习预测性能瓶颈。

本文提供的代码示例可直接用于生产环境,但需注意文件权限和磁盘空间管理。未来可进一步探索psutil的高级功能(如传感器监控、Docker容器监控),以满足更复杂的场景需求。

相关文章推荐

发表评论