Python实现系统性能监控:基础参数获取与文件存储全攻略
2025.09.15 13:50浏览量:4简介:本文详细介绍了如何使用Python获取系统基础性能参数(CPU、内存、磁盘、网络等),并通过代码示例演示如何将这些数据写入文件,适用于系统监控、性能分析等场景。
Python实现系统性能监控:基础参数获取与文件存储全攻略
在系统运维、性能调优或资源管理中,实时获取并记录系统基础性能参数是关键环节。Python凭借其丰富的标准库和第三方工具,能够高效完成这一任务。本文将系统阐述如何使用Python获取CPU、内存、磁盘、网络等基础性能参数,并将数据结构化写入文件,为开发者提供一套完整的解决方案。
一、核心工具与模块选择
Python生态中,psutil是系统性能监控的首选库。它跨平台(Windows/Linux/macOS),提供统一的API接口,支持获取CPU、内存、磁盘、网络、传感器等数十种参数。相较于手动调用系统命令(如top、vmstat),psutil更简洁、安全,且无需处理不同操作系统的命令差异。
1.1 安装与基础使用
pip install psutil
导入后,可直接调用函数获取参数:
import psutil# 获取CPU使用率cpu_percent = psutil.cpu_percent(interval=1)print(f"CPU使用率: {cpu_percent}%")# 获取内存信息mem = psutil.virtual_memory()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多核数据
cpu_percent_list = psutil.cpu_percent(interval=1, percpu=True)with open("cpu_log.csv", "a") as f:f.write(f"{time.time()},") # 时间戳f.write(",".join([f"{x:.2f}" for x in cpu_percent_list]) + "\n")
2.2 内存与交换分区监控
- 物理内存:
psutil.virtual_memory()返回总内存、可用内存、使用率等。 - 交换分区:
psutil.swap_memory()获取交换分区使用情况。 - 缓存与缓冲:通过
mem.cached和mem.buffers区分。
示例:内存快照写入JSON
import jsonmem_info = {"total": psutil.virtual_memory().total,"available": psutil.virtual_memory().available,"used_percent": psutil.virtual_memory().percent,"swap_used": psutil.swap_memory().used}with open("mem_snapshot.json", "w") as f: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实时监控
disk_io = psutil.disk_io_counters()with open("disk_io.log", "a") as f: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地址。
示例:网络流量差分计算
old_io = psutil.net_io_counters()time.sleep(1)new_io = psutil.net_io_counters()bytes_sent = new_io.bytes_sent - old_io.bytes_sentbytes_recv = new_io.bytes_recv - old_io.bytes_recvwith open("net_traffic.csv", "a") as f:f.write(f"{time.time()},sent:{bytes_sent},recv:{bytes_recv}\n")
三、数据存储与格式化
3.1 文件格式选择
- CSV:适合结构化数据,易于用Excel或Pandas分析。
- JSON:适合嵌套数据,便于程序解析。
- SQLite:适合长期存储,支持SQL查询。
3.2 高效写入策略
- 批量写入:避免频繁打开文件,可累积数据后一次性写入。
- 时间戳:所有记录应包含时间戳,便于后续分析。
- 异常处理:捕获文件操作异常,防止程序崩溃。
示例:综合监控脚本
import psutilimport timeimport csvfrom datetime import datetimedef write_to_csv(data, filename):with open(filename, "a", newline="") as f:writer = csv.writer(f)if f.tell() == 0: # 文件为空时写入表头writer.writerow(["timestamp", "cpu_percent", "mem_percent", "disk_read", "disk_write", "net_sent", "net_recv"])writer.writerow(data)def monitor():while True:# 获取CPU使用率cpu_percent = psutil.cpu_percent(interval=1)# 获取内存使用率mem_percent = psutil.virtual_memory().percent# 获取磁盘I/O(差分)old_io = getattr(monitor, "old_disk_io", psutil.disk_io_counters())new_io = psutil.disk_io_counters()disk_read = new_io.read_bytes - old_io.read_bytesdisk_write = new_io.write_bytes - old_io.write_bytesmonitor.old_disk_io = new_io# 获取网络I/O(差分)old_net = getattr(monitor, "old_net_io", psutil.net_io_counters())new_net = psutil.net_io_counters()net_sent = new_net.bytes_sent - old_net.bytes_sentnet_recv = new_net.bytes_recv - old_net.bytes_recvmonitor.old_net_io = new_net# 写入CSVtimestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")data = [timestamp, cpu_percent, mem_percent, disk_read, disk_write, net_sent, net_recv]write_to_csv(data, "system_monitor.csv")time.sleep(1) # 每秒采集一次if __name__ == "__main__":monitor()
四、高级应用与优化
4.1 实时告警机制
结合阈值判断,当CPU使用率持续超过90%时,通过邮件或短信告警。可使用smtplib发送邮件,或集成第三方告警服务。
4.2 数据可视化
将CSV数据导入Pandas或Matplotlib,生成趋势图:
import pandas as pdimport matplotlib.pyplot as pltdf = pd.read_csv("system_monitor.csv")df["timestamp"] = pd.to_datetime(df["timestamp"])df.set_index("timestamp").cpu_percent.plot(title="CPU使用率趋势")plt.show()
4.3 性能优化技巧
- 采样频率:根据需求调整采样间隔(如1秒或5秒)。
- 资源占用:避免在监控脚本中执行耗时操作。
- 多线程:使用
threading模块分离数据采集与写入操作。
五、总结与扩展
Python通过psutil库实现了跨平台的系统性能监控,结合文件存储可构建轻量级监控系统。开发者可根据实际需求扩展功能,如:
本文提供的代码示例可直接用于生产环境,但需注意文件权限和磁盘空间管理。未来可进一步探索psutil的高级功能(如传感器监控、Docker容器监控),以满足更复杂的场景需求。

发表评论
登录后可评论,请前往 登录 或 注册